У меня есть простой @Controller
класс, который отображает страницу после того, как пользователь вошел в систему:Spring MVC как запретить привязку данных к ModelAttribute?
@Controller
@SessionAttributes("user")
public class DashBoardController {
@RequestMapping(value="/user/dashBoard", method=RequestMethod.GET)
public String showDashBoardPage(@ModelAttribute("user") User user, Model model) {
//do some work here....
return "dashBoard";
}
}
, как вы видите, user
атрибут уже присутствует в сессии, и с помощью @ModelAttribute
аннотацию я только хочу, чтобы вытащить его оттуда, ничего больше. Но если вы добавляете какой-либо параметр для запроса, то spring пытается связать этот параметр с существующим пользовательским объектом, чего я не хочу, как запретить такое поведение?
Чтобы быть более точным, вот класс User:
public class User {
private String name;
private String password;
private Language language;
//public getters and setters here...
}
Если я хочу изменить язык моей dashBoard
страницы, я прошу эту страницу с добавлением ?language=en
параметра и в этом случае Spring пытается изменить язык поле атрибута пользовательской модели, которое, конечно, выходит из строя с исключением типа несоответствия. Конечно, я могу обойти, изменив имя параметра на то, что не соответствует ни одному из полей User
, но это похоже на хрупкое решение. Есть ли способ контролировать это поведение привязки данных? Я использую Spring 4.1.3
Не используйте '@ ModelAttribute' для этого ... Если он не используется для привязки данных не использовать его ... Если вы хотите иметь зарегистрированный пользователь, должен интегрироваться с обычным материалом безопасности и использовать «Принципал», если вы действительно хотите использовать свое собственное решение, создайте свой собственный HandlerMethodArgumentResolver, который знает, что делать с «User». –
Вы можете получить 'пользователь' через' model', что устраняет необходимость в '@ModelAttribute (« пользователь ») пользователя пользователя вообще. – zeroflagL
Спасибо за комментарии. На данный момент я решил использовать ModelMap # get(), чтобы вытащить пользователя из сеанса, но позже я перейду к Spring Spring, поскольку он предназначен для обработки этой функции. – troy