[英]Spring MVC 3 validation with annotations - not showing form:errors
I've been stuck with this about one hour, this is not the first time i am doing this but I cant figure it out. 我已经坚持了大约一个小时,这不是我第一次这样做,但我无法弄明白。
It should show me the form errors, instead it throws this exception. 它应该显示表单错误,而不是抛出此异常。
LE: i managed to solve the exception in the meantime, but i still cant see the errors. LE:我在此期间设法解决了异常,但我仍然无法看到错误。 they are not rendered 他们没有呈现
org.springframework.web.util.NestedServletException: Request processing failed; org.springframework.web.util.NestedServletException:请求处理失败; nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors Field error in object 'category' on field 'name': rejected value [jk]; 嵌套异常是org.springframework.validation.BindException:org.springframework.validation.BeanPropertyBindingResult:1 errors字段'name'上对象'category'中的字段错误:被拒绝的值[jk]; codes [Range.category.name,Range.name,Range.java.lang.String,Range]; 代码[Range.category.name,Range.name,Range.java.lang.String,Range]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [category.name,name]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable:codes [category.name,name]; arguments []; 参数[]; default message [name],25,3]; 默认消息[name],25,3]; default message [gfhghj] org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) org.springfr 默认消息[gfhghj] org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)javax.servlet.http.HttpServlet.service (HttpServlet.java:637)javax.servlet.http.HttpServlet.service(httpServlet.java:717)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:311)org.springframework.security.web .access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:323)org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:323)org.springfr amework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticat amework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:323)org.springframework.security.web.authentication.AnonymousAuthenticationFilter。 doFilter(AnonymousAuthenticationFilter.java:113)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:323)org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)org。 springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:323)org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain。 doFilter(FilterChainProxy.java:323)org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticat ionFilter.java:150) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173) org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) org. ionFilter.java:150)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:323)org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182)org.springframework。 security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:323)org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain。 doFilter(FilterChainProxy.java:323)org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:323)org。 springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173)org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)org。 springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 76)org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
@Controller
@RequestMapping("/category")
public class CategoryController {
@Autowired
StockGateway stockGateway;
@RequestMapping(value = "add", method = RequestMethod.POST)
public String addCategory(@Valid @ModelAttribute("category") CategoryAdd category, ModelMap model,
BindingResult binding) {
if (binding.hasErrors()) {
return "category.add";
}
CategoryDTO dto = Converter.toCategory(category);
try {
stockGateway.createCategory(dto);
} catch (StockGatewayException e) {
e.printStackTrace();
}
return "redirect:/category/add";
}
@RequestMapping(value = "add", method = RequestMethod.GET)
public String initView(ModelMap model) {
model.put("category", new CategoryAdd());
return "category.add";
}
} }
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:spring="http://www.springframework.org/tags"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:security = "http://www.springframework.org/security/tags"
xmlns:util="urn:jsptagdir:/WEB-INF/tags/util"
xmlns:form="http://www.springframework.org/tags/form"
version="2.0">
<security:authorize access="hasRole('ROLE_STOCK')" var="isStock">
<form:form modelAttribute="category" method="POST" action="add" >
<table>
<tr>
<td>Name :</td> <td> <form:input path="name" /></td>
</tr>
<tr>
<td></td> <td> <form:errors path="name" cssClass="error" /></td>
</tr>
</table>
<form:button>Add</form:button>
</form:form>
</security:authorize>
public class CategoryAdd {
@Range(min= 3 , max = 25, message="gfhghj")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
There seems to be a dependency on the order in which the parameters must be listed in the mapped controller method. 似乎必须依赖于映射控制器方法中必须列出参数的顺序。
For example: 例如:
public String addCategory(@Valid CategoryAdd category,BindingResult result,
Map map)
Will work, whereas: 会工作,而:
public String addCategory(@Valid CategoryAdd category, Map map,
BindingResult result)
Will not. 将不会。 I don't full understand why this is, especially as it compiles without any issues. 我不完全理解为什么会这样,特别是因为它编译没有任何问题。
So complete solution is: 完整的解决方案是:
public String addCategory(@Valid CategoryAdd category,BindingResult result,
Map map
) {
if (result.hasErrors()) {
map.put("categoryAdd", (CategoryAdd)result.getTarget());
return "category.add";
}
CategoryDTO dto = Converter.toCategory(category);
try {
stockGateway.createCategory(dto);
} catch (StockGatewayException e) {
e.printStackTrace();
}
return "redirect:/category/add";
Notice i changed parameter ModelMap with Map, and if the result has errors i put back the model from the result. 注意我用Map改变了参数ModelMap,如果结果有错误,我从结果中放回模型。
Now the WTF: The BindingResult has a field objectName, which has the value the name of the class. 现在WTF:BindingResult有一个字段objectName,其值为类的名称。 You have to set the modelAttribute/commandName to that. 您必须将modelAttribute / commandName设置为该值。 To be the same as objectName in BindingResult, or else it wont render the errors. 与BindingResult中的objectName相同,否则它不会呈现错误。 So to match it: 所以要匹配它:
<form:form modelAttribute="categoryAdd" commandName="categoryAdd" method="POST" action="add" >
Does anyone know how can we change the objectName from the BindingResult? 有谁知道我们如何从BindingResult更改objectName? By default it will take the name of the class. 默认情况下,它将采用类的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.