Как я могу получить объект из модели в контроллере с помощью Spring MVC 3? - PullRequest
5 голосов
/ 12 сентября 2011

У меня есть контроллер с методом, который обрабатывает входящие данные GET, сохраняет некоторые вещи в model, а затем перенаправляет на другую страницу, которая имеет дело с этими объектами.

Кажется, я не могу найти какой-либо хороший способ вернуть объект, сохраненный в первом методе, из модели для использования во втором методе. Как я могу это сделать?

Вот верхняя часть контроллера:

@Controller
@RequestMapping("/reviews")
@SessionAttributes({"review", "externalReview"})
public class ReviewController {
    // [SNIP]
}

Вот код, который добавляет объекты, которые мне нужны, к модели:

@RequestMapping(value="/new", params="UName", method=RequestMethod.GET)
public String newFormFromExternal(@ModelAttribute("externalReview") ExternalReview externalReview, Model model) throws IncompleteExternalException {
    // Convert the inbound external
    Review fromExternal = ExternalReviewUtil.reviewFromExternalReview(externalReview, externalDAO);

    // Add the externalReview to the session so we can look to see if we got a reviewee on the way in
    model.addAttribute("externalReview", externalReview);

    model.addAttribute("review", fromExternal);

    return "redirect:/reviews/newFromExternal";
}

Ответы [ 3 ]

2 голосов
/ 16 ноября 2011

Вам повезло.

Если вы используете или можете обновить только что выпущенную версию Spring 3.1 , вы можете использовать только новые переменные Flash .

http://static.springsource.org/spring/docs/3.1.0.RC1/spring-framework-reference/html/mvc.html#mvc-flash-attributes

Если вы не можете использовать 3.1, вы, вероятно, можете реализовать решение самостоятельно. По сути, вы хотите захватить объект модели, который должен присутствовать в перенаправлении, поместить в сеанс и удалить его после извлечения, чтобы предотвратить вздутие сеанса.

1 голос
/ 12 сентября 2011

Одним из возможных решений является использование @ModelAttribute, хотя это довольно уродливо, поскольку вам нужно отключить привязку данных для этого атрибута (для безопасности):

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET) 
public String newExternalForm(@ModelAttribute Review review) {
    ...
}

@InitBinder("review")
public void disableReviewBinding(WebDataBinder b) {
    b.setAllowedFields();
}
1 голос
/ 12 сентября 2011

В настоящее время я просто получаю Map модели, получаю нужный объект по его ключу (имя String), а затем приводю его к объекту, которым он является (а не просто *). 1003 *).

Вот код:

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET)
public String newExternalForm(Model model) {
    // Get the review from the model
    Review review = (Review) model.asMap().get("review");

    /*** Do stuff with the review from the model ****/

    return "reviews/newFromPacs";
}

Этот способ работает, но кажется хакерским и неуклюжим. Это действительно единственный способ?

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