2015-01-02 5 views
7

У меня есть простой @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

+4

Не используйте '@ ModelAttribute' для этого ... Если он не используется для привязки данных не использовать его ... Если вы хотите иметь зарегистрированный пользователь, должен интегрироваться с обычным материалом безопасности и использовать «Принципал», если вы действительно хотите использовать свое собственное решение, создайте свой собственный HandlerMethodArgumentResolver, который знает, что делать с «User». –

+1

Вы можете получить 'пользователь' через' model', что устраняет необходимость в '@ModelAttribute (« пользователь ») пользователя пользователя вообще. – zeroflagL

+0

Спасибо за комментарии. На данный момент я решил использовать ModelMap # get(), чтобы вытащить пользователя из сеанса, но позже я перейду к Spring Spring, поскольку он предназначен для обработки этой функции. – troy

ответ

2

Существует атрибут @ModelAttribute под названием binding, для которого вы можете установить значение false, чтобы отключить привязку параметров запроса. Использование: @ModelAttribute(binding=false) перед тем параметр метода.

Ссылка: click

Смежные вопросы