Spring MVC и методы-обработчики с POJO - PullRequest
2 голосов
/ 08 июля 2011

Spring MVC позволяет определять методы-обработчики с различными параметрами , которые заполняются соответствующими значениями.

Можно ли использовать тот же подход для заполнения значений вPOJO, который затем передается методу-обработчику?

В настоящее время я должен сделать:

@RequestMapping
public ModelMap handle( @RequestParam("user") String user, ... )

Что я хотел бы сделать:

class HandlerPojo {
    @RequestParam("user") String user;
    ...
}

@RequestMapping
public ModelMap handle( HandlerPojo pojo )

Ответы [ 3 ]

4 голосов
/ 08 июля 2011

В документации, на которую вы ссылались, написано:

Методы-обработчики, которые аннотированы с @RequestMapping может иметь очень гибкие подписи. [...]

  • Команда или формировать объекты для привязки параметров к: как свойства или поля бина, с настраиваемое преобразование типов [...]

Вы не можете использовать аннотацию @RequestMapping для свойств / полей POJO, как вы это делали в своем примере, но если имена свойств POJO отображают имена параметров, POJO будет создан и заполнен Spring должным образом ,

2 голосов
/ 08 июля 2011

На самом деле это довольно просто, даже без каких-либо аннотаций Spring @RequestParam внутри POJO.То, что вы ищете, это пользовательский WebArgumentResolver.Вот полный пример:

@Service
public class UserArgumentResolver implements WebArgumentResolver {
    @Override
    public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
        if (methodParameter.getParameterType() == User.class) {
            return new User(webRequest.getParameter("user"));
        }
        return WebArgumentResolver.UNRESOLVED;
    }
}

Код довольно понятен: если один из параметров обработчика имеет тип User, извлеките параметр запроса с именем user и верните все, что вы хотите (конечно,он должен быть назначен на User. WebArgumentResolver.UNRESOLVED означает, что распознаватель был неспособен обработать этот параметр, и последующие распознаватели должны быть проверены.

К сожалению, распознаватель не выбран по умолчанию, он должен быть зарегистрирован:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolver" ref="userArgumentResolver"/>
</bean>

<mvc:annotation-driven />

Вот и все! Ваш обработчик теперь может выглядеть так:

@RequestMapping
public void handle(User user) {
    //...
}
0 голосов
/ 08 июля 2011

Это невозможно, @RequestMapping извлекает параметры, указанные в запросе, и присваивает их значения переменной java.Вы не можете передать pojo в запросе, потому что pojo не существует на клиенте.Может быть, посмотрите на передачу некоторого json назад и десериализацию его в pojo, используя jackson или gson.

...