Spring MVC параметры привязки к объекту поддержки - PullRequest
2 голосов
/ 29 октября 2009

Я использую Spring MVC, и в моем контроллере я хочу иметь возможность автоматически связывать входящие параметры с моим объектом Java. Кажется, это должно быть довольно легко сделать. Единственная проблема заключается в том, что имена входящих параметров (например, «имя пользователя») могут не совпадать точно с именем поля в объекте java (например, «имя»).

Из документации Spring (http://static.springsource.org/spring/docs/2.5.6/reference/mvc.html):

)

"Spring Web MVC позволяет использовать любые объект как объект команды или формы .... Все это означает, что вам не нужно дублировать ваши бизнес-объекты " свойства как простые, нетипизированные строки в вашей форме объекты просто чтобы иметь возможность обрабатывать неверные представления, или конвертировать строки правильно. Вместо, часто предпочтительно связывать непосредственно к вашим бизнес-объектам. «

Как мне на самом деле это сделать? Любой код или ссылки приветствуются.

Например, мой бизнес-объект

public class User {
  private String username;
  private String password;

  //getters and setter
}

Запрос, который обрабатывает мой контроллер:

example.com / логин? Имя = Steve & Pw = 1234

Я бы хотел связать «Steve» с User.username и «1234» с User.password.

Спасибо.

Ответы [ 6 ]

1 голос
/ 20 марта 2014

В этом случае вы можете использовать собственный преобразователь аргументов.

public class UserArgumentResolver implements HandlerMethodArgumentResolver {
    public Object resolveArgument(final MethodParameter parameter,
                                  final ModelAndViewContainer container,
                                  final NativeWebRequest webRequest,
                                  final WebDataBinderFactory binderFactory) {
        final User user = new User();
        user.setUsername(webRequest.getParameter("name"));
        user.setPassword(webRequest.getParameter("pw"));

        return user;
    }
}

А в вашем весеннем конфиге:

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="your.package.UserArgumentResolver"/>
    </mvc:argument-resolvers>
</mvc:annotation-driven>
1 голос
/ 29 октября 2009

Если я правильно помню, вы можете переопределить public Object formBackingObject(HttpServletRequest request) и вручную настроить вашу команду POJO.

0 голосов
/ 11 апреля 2011

Вы должны изменить свою форму или объект так, чтобы имена совпадали. Если вы пытаетесь использовать функции в такой среде, как Spring MVC, вам, вероятно, следует следовать их соглашениям.

Соглашение по конфигурации.

0 голосов
/ 29 октября 2009

Если вы хотите привязать запрос к POJO, вам может потребоваться расширить AbstractCommandController или, если у вас есть форма - SimpleFormController. Я полагаю, что вам потребуется версия сервлета из пакета org.springframework.web.servlet.mvc.

  • используйте setCommandClass () для установки правильного типа вашего компонента поддержки в конструкторе контроллера, т.е. POJO:

    setCommandClass (User.class);

  • formBackingBean () используется для создания нового экземпляра POJO, который будет использоваться контроллером.

  • контроллер отвечает за сопоставление параметров запроса с полями POJO.
  • если сопоставление не работает для вас, тогда переопределите методы formBackingBean () или onBind (), чтобы прочитать параметры запроса и поместить значения в POJO.
0 голосов
/ 29 октября 2009

РЕДАКТИРОВАТЬ: Делайте то, что сказал Калеб, переопределяя формуBackingObject чище.

Я оставлю эту записку, хотя:

Однако, если у вас есть контроль над обеими сторонами, я настоятельно рекомендую сделать имя согласованным. Соглашение по конфигурации.

0 голосов
/ 29 октября 2009

example.com / логин? Имя пользователя = Steven & пароль = 1234

Вы не можете ожидать, что Spring MVC выполнит автоматическое связывание, когда имена свойств не совпадают. Это просто не логично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...