Весна, средний балл в параметре запроса

Есть ли способ сопоставить параметр запроса со средней оценкой, используя запросы весной?

У меня нет проблем с привязкой однозначных параметров:

Пример Uri: http://localhost:8080/test/?product=hotels

public class CitiesRequest{
    private ProductType product;

    public ProductType getProduct() {
        return this.product;
    }

    public void setProduct(String product) {
        this.product = product;
    }
}

Но я хотел бы иметь возможность получать такие параметры:

http://localhost:8080/test/?product-type=hotels

person btuso    schedule 27.05.2014    source источник
comment
Я новичок в Spring, поэтому я действительно не знаю внутренней работы или правильности того, что я делаю. Насколько я могу судить, установщик параметров должен совпадать с именем параметра, поэтому я несколько раз пытался изменить его, например: setProductType, setProduct_type, setProducttype, но это не сработало. На самом деле я не получаю никакой ошибки, параметр просто остается нулевым.   -  person btuso    schedule 27.05.2014
comment
Какую версию Spring и какой контроллер вы используете? Для Spring › 3.1 аннотация @RequestMapping может явно указывать имя параметра.   -  person Serge Ballesta    schedule 28.05.2014
comment
Я использую версию 3.2.3, и я не уверен, что вы имеете в виду о контроллере, так как я новичок в этом. Я знаю об аннотации @RequestMapping, но, поскольку я буду использовать много параметров, я стараюсь избегать ее, чтобы сделать код немного чище. Вот почему я использую запрос вместо аннотаций.   -  person btuso    schedule 28.05.2014


Ответы (2)


По умолчанию Spring сопоставляет ключ параметра запроса с именем переменной Java. Однако синтаксически неправильно иметь имя переменной с дефисом в Java, что объясняет, почему вам особенно трудно заставить Spring установить значение параметра для вас.

Один обходной путь, который может сработать, заключается в том, чтобы просто иметь параметр Map<String, String[]> для представления всех параметров. Тогда Spring не нужно сопоставлять какие-либо параметры запроса с именами переменных, поэтому имя через дефис может оказаться в этой карте всех параметров. Это может быть не так удобно, как предварительно разделенные объекты параметров, но может получить ключи через дефис.

Другим решением может быть настройка WebDataBinder, которая управляет тем, как данные из HTTP-запросов сопоставляются с параметрами запроса вашего контроллера. Но это целая банка червей, особенно если вы только начинаете работать со Spring. Подробнее об этом можно прочитать в документации в разделе «привязка данных».

person Misha    schedule 31.05.2014

Как заявил Миша, синтаксически неправильно иметь имя переменной с дефисом в Java. Но Spring с этим справляется и позволяет указать имя параметра (в запросе), отличное от имени переменной (в java-коде). Например, при использовании управляемого контроллера RequestMapping можно написать:

@RequestMapping("/test")
public ModelAndView getProduct(
        @RequestParam("product-type") String productType) {
...
}

Таким образом, getProduct будет вызываться для URL-адреса типа http://localhost/test?product-type=hotels, а параметр productType получит значение hotels. И все пока чисто декларативно.

person Serge Ballesta    schedule 31.05.2014