我正在尝试制作一个发布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) 我有一个像这样的控制器:
@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
我最近正在努力学习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
我有一个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?
在浏览了docs.spring.org引用的一些教程和初始文档后,我了解到它是在开发人员创建的POJO类的控制器中创建的.但在阅读本文时,我看到了以下段落:
一个
@ModelAttribute上的方法参数指示参数应该从模型中检索.如果模型中不存在,则应首先实例化参数,然后将其添加到模型中.一旦出现在模型中,参数的字段应该从具有匹配名称的所有请求参数中填充.这在Spring MVC中称为数据绑定,这是一种非常有用的机制,可以使您不必单独解析每个表单字段.Run Code Online (Sandbox Code Playgroud)@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST) public String processSubmit(@ModelAttribute Pet pet) { }
在该段中,最令人不安的是这条线:
"如果模型中没有......"
模型中的数据如何?(因为我们还没有创建模型 - 它将由我们创建.)
此外,我已经看到一些控制器方法接受该Model类型作为参数.那是什么意思?它是否Model在某处创建?如果是这样,谁为我们创造它?
我在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是否支持原始数据类型,但没有很好的结果.有没有人有这个问题的经验?
以下是一个简单的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 …
我有带方法的 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 以使用用户的一些默认实现?
好的,是时候寻求帮助了;我正在向我的 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 }\nRun 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 }\nRun Code Online (Sandbox Code Playgroud)\n\n我的jsp:
\n\n<div class="container MainContent">\n <form:form …Run Code Online (Sandbox Code Playgroud) 正如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) modelattribute ×10
spring-mvc ×8
spring ×7
java ×5
annotations ×1
data-binding ×1
default ×1
forms ×1
httpsession ×1
interface ×1
jquery ×1
jsp ×1
null ×1
primitive ×1