标签: modelattribute

Spring MVC ModelAttribute字段是空的而不是表单输入值

我正在尝试制作一个发布CardRequestResource的表单:

public class CardRequestResource extends ResourceSupport{
    private Long cardRequestId;
    private String deliveryMethod;
    private String address;
    private boolean isHomeDelivery;
    private String requestDate;
    private String expectedDate;
    private String comments;
    private Long statusId;
    private PersonResource person;

    //Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我首先加载JSP并将一个空的CardRequestResource添加到ModelMap:

@RequestMapping(value = { "", "/approval" }, method = RequestMethod.GET)
public String getApproval(ModelMap map) {
    map.put("cardRequestResource", new CardRequestResource());       
    return "cardoffice/approval";
}
Run Code Online (Sandbox Code Playgroud)

我的JSP使用cardRequestResource模型属性构建表单:

<form:form id="detailForm" name="detailForm" modelAttribute="cardRequestResource">
    <form:input path="statusId" type="hidden" id="statusId" name="statusId" />
    <form:textarea path="comments" name="comments" id="commentTextarea" rows="7" cols="81" style="font-style: normal;"/>
</form:form>
Run Code Online (Sandbox Code Playgroud)

Javascript函数进行AJAX调用以填充表单值:

function …
Run Code Online (Sandbox Code Playgroud)

forms null jquery spring-mvc modelattribute

8
推荐指数
1
解决办法
1万
查看次数

Spring MVC可以在@RequestMapping之后调用@ModelAttribute吗?

我有一个像这样的控制器:

@Controller
public class HomeController {

    @RequestMapping(value = "/update", method = RequestMethod.POST)
    public String update(@RequestParam("user") User user, ModelMap model){
        SaveUserToDatabase(user);
        return "index";
    }

    @ModelAttribute("user")
    String getUser() {
        return LoadCurrentUserFromDataBase();
    }
}
Run Code Online (Sandbox Code Playgroud)

简而言之,我的观点user几乎可以在每个动作中呈现HomeController,但我不想编码:

model.addAttribute("user", LoadCurrentUserFromDataBase())
Run Code Online (Sandbox Code Playgroud)

在每一个行动中,相反,我正在寻找一种方式@ModelAttribute来揭露user我的所有观点.

但是,根据文档,@ModelAttribute控制器中的方法 @RequestMapping方法之前,在同一个控制器中调用.

至于我的代码,getUser之前被调用update,但我想获得更新的用户.

有没有办法动作之后公开user属性而不在每个动作中显式调用?model.addAttribute

java spring spring-mvc modelattribute

7
推荐指数
1
解决办法
1933
查看次数

Spring MVC - HttpSession.setAttribute和model.addObject之间的区别

我最近正在努力学习Spring MVC.似乎我不太了解@ModelAttribute注释和HttpSession的功能.

@SessionAttributes({"shoppingCart", "count"})
public class ItemController {

@ModelAttribute("shoppingCart")
public List<Item> createShoppingCart() {
    return new ArrayList<Item>();
}

@ModelAttribute("count")
public Integer createCount() {
    return 0;
}

@RequestMapping(value="/addToCart/{itemId}", method=RequestMethod.GET)
public ModelAndView addToCart(@PathVariable("itemId") Item item, 
        @ModelAttribute("shoppingCart") List<Item> shoppingCart, @ModelAttribute("count") Integer count) {

    if(item != null) {
        shoppingCart.add(item);
        count = count + 1;
    }

    return new ModelAndView(new RedirectView("showAllItems")).addObject("count", count);
}

@RequestMapping(value="/deleteFromCart/{itemId}", method=RequestMethod.GET)
public ModelAndView deleteFromCart(@PathVariable("itemId") Item item, 
        HttpSession session) {

    List<Item> list = (List<Item>) session.getAttribute("shoppingCart");
    list.remove(item);
    //session.setAttribute("shoppingCart", list);

    Integer count = (Integer) session.getAttribute("count");
    count …
Run Code Online (Sandbox Code Playgroud)

spring session-variables spring-mvc httpsession modelattribute

6
推荐指数
1
解决办法
1万
查看次数

Spring形式ModelAttribute字段验证,以避免400 Bad Request Error

我有一个ArticleFormModel正常发送的包含数据,html form由Spring使用@ModelAttribute注释注入,即

@RequestMapping(value="edit", method=RequestMethod.POST)
public ModelAndView acceptEdit(@ModelAttribute ArticleFormModel model, 
    HttpServletRequest request, BindingResult errors)
{
    //irrelevant stuff
}
Run Code Online (Sandbox Code Playgroud)

在某些方面,一切都很完美.问题是ArticleFormModel包含一个double字段(protected使用普通的setter设置).只要用户发送的数据是数字,一切正常.当他们输入一个单词时,我得到的只是400 Bad Request Http Error.

我已经WebDataBinder为这个控制器注册了一个

@InitBinder
protected void initBinder(WebDataBinder binder) throws ServletException
{
    binder.setValidator(validator);
}
Run Code Online (Sandbox Code Playgroud)

where validator实现org.springframework.validation.Validator接口的自定义类的实例,但我不知道下一步该做什么.我希望能够解析模型,获得有效的HTTP响应并在表单中显示错误消息.initBinder()调用该方法,我可以从中调用validator.validate(),但它不会更改错误(对于错误的数据).

我知道我可以使用setter来解析字符串,检查它是否为数字,如果没有,将该信息存储在变量中,然后在验证期间检索该变量,但这似乎太多了.必须有一种更简单的方法来强制字段上的类型而不会出现错误.此外,问题在于数据绑定,而不是验证,所以我觉得它应该放在相应的代码层中.

我也在考虑实施java.beans.PropertyEditor和调用binder.registerCustomEditor(),但我缺乏可靠的知识来源.

客户端验证(通过JavaScript检查数据是否为数字)是不可能的.

TL; DR:

如何在@ModelAttribute不获取项目的情况下强制某个字段具有特定类型400 Bad Request Http Error

java spring http-status-code-400 modelattribute

6
推荐指数
1
解决办法
1万
查看次数

究竟是在Spring MVC中创建的模型对象?

在浏览了docs.spring.org引用的一些教程和初始文档后,我了解到它是在开发人员创建的POJO类的控制器中创建的.但在阅读本文时,我看到了以下段落:

一个@ModelAttribute上的方法参数指示参数应该从模型中检索.如果模型中不存在,则应首先实例化参数,然后将其添加到模型中.一旦出现在模型中,参数的字段应该从具有匹配名称的所有请求参数中填充.这在Spring MVC中称为数据绑定,这是一种非常有用的机制,可以使您不必单独解析每个表单字段.

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) {

}
Run Code Online (Sandbox Code Playgroud)

Spring文档

在该段中,最令人不安的是这条线:

"如果模型中没有......"

模型中的数据如何?(因为我们还没有创建模型 - 它将由我们创建.)

此外,我已经看到一些控制器方法接受该Model类型作为参数.那是什么意思?它是否Model在某处创建?如果是这样,谁为我们创造它?

java spring spring-mvc modelattribute request-mapping

6
推荐指数
1
解决办法
1897
查看次数

ModelAttribute可以原始吗?

我在Spring MVC 3.0中的ModelAttribute遇到了一个奇怪的问题.当我在localhost部署应用程序时,它工作正常.但是当我在远程服务器上部署应用程序时,每次用户访问特定操作时都会失败,并显示以下错误:

ERROR: my.package.application.web.filter.ExceptionFilter - long.<init>()
java.lang.NoSuchMethodException: long.<init>()
        at java.lang.Class.getConstructor0(Class.java:2706)
        at java.lang.Class.getDeclaredConstructor(Class.java:1985)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:104)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:762)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:356)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:153)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
Run Code Online (Sandbox Code Playgroud)

我用来在该控制器中初始化ModelAttribute的代码是:

    @ModelAttribute("id")
    public long getUserId(HttpSession session) {
        UserInfoHolder userHolder = (UserInfoHolder) session
                .getAttribute("userHolder");
        long userId = userHolder.getUserId();
        return userId;
    }
Run Code Online (Sandbox Code Playgroud)

据我所知,该错误无法在我的本地工作站上重现.它发生在动作被调用之前.

查看HandlerMethodInvoker.java(第762行),我们看到这一行:

bindObject = BeanUtils.instantiateClass(paramType);
Run Code Online (Sandbox Code Playgroud)

我经验丰富的同行认为这一行导致问题,因为原始类型的ModelAttribute(long)没有构造函数.我认为这个原因可能是正确的,但是如何解释Web应用程序在我的本地服务器上运行良好?

我试图搜索以了解ModelAttribute是否支持原始数据类型,但没有很好的结果.有没有人有这个问题的经验?

java primitive spring-mvc primitive-types modelattribute

5
推荐指数
1
解决办法
1558
查看次数

何时是一个精确调用的@ModelAttribute注释方法?

以下是一个简单的Spring表单控制器来处理"添加项目"用户请求:

@Controller
@RequestMapping("/addItem.htm")
public class AddItemFormController {

    @Autowired
    ItemService itemService;

    @RequestMapping(method = RequestMethod.GET)
    public String setupForm(ModelMap model) {
        return "addItem";
    }

    @ModelAttribute("item")
    public Item setupItem() {
        Item item = new Item();
        return item;
    }

    @RequestMapping(method = RequestMethod.POST)
    protected String addItem(@ModelAttribute("item") Item item) {
        itemService.addItem(item);
        return "itemAdded";
    }

}
Run Code Online (Sandbox Code Playgroud)

我在某处读到: (...) the @ModelAttribute is also pulling double duty by populating the model with a new instance of Item before the form is displayed and then pulling the Item from the model …

java data-binding spring spring-mvc modelattribute

5
推荐指数
1
解决办法
2376
查看次数

spring 接口作为@ModelAttribute 参数

我有带方法的 UsersController:

@RequestMapping(value={"/new"}, method=RequestMethod.GET)
public String showCreationForm(@ModelAttribute User user){
    return "user_registration_form";
}
Run Code Online (Sandbox Code Playgroud)

显示注册表单。我想在我的项目中保持模块化(在其他项目中使用这个控制器会很好),所以 User 是一个接口,并且有它的实现 - UserImpl。问题是 Spring 无法实例化用户界面。有没有办法配置 spring 以使用用户的一些默认实现?

implementation spring default interface modelattribute

5
推荐指数
1
解决办法
953
查看次数

ModelAttribute 在 Spring MVC 的控制器中返回 null 值

好的,是时候寻求帮助了;我正在向我的 jsp 发送一个(购物)购物车 ModelAttribute,允许用户编辑数量,当模型 POST 到控制器时,除了可编辑(数量)字段之外,其他字段均为空。我已经研究了几天类似的问题,但没有任何匹配。我使用的是spring 3.1。

\n\n

这是我的 GET 和 POST 控制器:

\n\n
@Controller\npublic class CartController {\n\n      @Autowired\n      private Cart cart;        \n\n      @RequestMapping(value = "/cart", method = RequestMethod.GET)  \n      public String showCart(Model model) {\n         logger.debug("CartController.showCart() Cart: {}", this.cart);\n         model.addAttribute(cart);\n         return "cart/cart";\n      }\n
Run Code Online (Sandbox Code Playgroud)\n\n

和邮寄

\n\n
   @RequestMapping(value = "/cart", method = RequestMethod.POST, params = "update")\n   public String update(@ModelAttribute("cart") Cart cart, BindingResult result, Model model) {\n      logger.debug("CartController.update() Cart: {}", cart); \n      return "cart/cart";\n   }\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的jsp:

\n\n
<div class="container MainContent">\n   <form:form …
Run Code Online (Sandbox Code Playgroud)

spring jsp spring-mvc modelattribute

5
推荐指数
1
解决办法
2万
查看次数

Spring中的@ModelAttribute和@SessionAttribute

正如Spring规范所说,@ModelAttribute将在映射处理程序之前执行,@SessionAttribute将模型属性保留在会话中。

考虑下面的场景:表单 bean 在控制器被调用后创建,并且也被设置为会话属性。下次调用 MenuController 时,createForm() 将再次执行并创建另一个新的表单 bean。我的问题是:这个最新创建的表单 bean 会被设置为会话属性吗?哪个表单 bean 将绑定到方法 bookList() 中的参数?

希望大家能帮忙。谢谢。

@Controller
@RequestMapping("/store")
@SessionAttribute("form")
public class MenuController {
     @ModelAttribute("form")
     public Form createForm() {
     return new Form();
     }

     @RqeustMapping("/book")
     public String bookList(@ModelAttribute("form") Form form){
     //processing the form
     }
}
Run Code Online (Sandbox Code Playgroud)

annotations spring-mvc modelattribute

4
推荐指数
1
解决办法
1万
查看次数