Проверка Spring MVC 3 с аннотациями - не показывается форма: ошибки - PullRequest
2 голосов
/ 12 марта 2012

Я застрял с этим около часа, это не первый раз, когда я делаю это, но я не могу понять это.

Это должно показать мне ошибки формы, вместо этого выдает это исключение.

LE: Тем временем мне удалось устранить исключение, но я все еще не вижу ошибок.они не отображаются

org.springframework.web.util.NestedServletException: обработка запроса не удалась;Вложенное исключение: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 ошибка Ошибка поля в объекте «категория» в поле «имя»: отклоненное значение [jk];коды [Range.category.name, Range.name, Range.java.lang.String, Range];Аргументы [org.springframework.context.support.DefaultMessageSourceResolvable: codes [category.name, name];аргументы [];сообщение по умолчанию [имя], 25,3];сообщение по умолчанию [gfhghj] org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:894) org.springframework.web.servlet.(HttpServlet.java:637) javax.servlet.http.HttpServlet.service (HttpServlet.java:717) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain..access.intercept.FilterSecurityInterceptor.invoke (FilterSecurityInterceptor.java:116) org.springframework.security.web.access.intercept.(FilterChainProxy.java:323) org.springframework.security.web.access.ExceptionTranslationFilter.doFilter (ExceptionTranslationFilter.java:113) org.springframework.security.web.FilterChainProxy $ VirtualFilterCr.amework.security.web.session.doFilter (AnonymousAuthenticationFilter.java:113) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:323) org.springframework.security.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:323) org.springframework.security.web.savedrequest.RequestCacheAwareFilter.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.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:323) org.springframework.security.web.authentication.logout.doFilter (FilterChainProxy.java:323) org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter (SecurityContextPersistenceFilter.java:87) org.springframework.security.web.FilterCha.Filin.FilinFhainFox.ChinProxyspringframework.security.web.FilterChainProxy.doFilter (FilterChainProxy.java:173)org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate (DelegatingFilterProxy.java:346) org.springframework.web.filter.DelegatingFilterProxy.doFilter (DelegatingFilterProxy.java:25Hetjava: 77) org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:76) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncoding:Filter.Filter.Filter.Filter.Filter.F).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;
}

Ответы [ 2 ]

23 голосов
/ 03 июля 2012

Кажется, существует зависимость от порядка, в котором параметры должны быть перечислены в методе сопоставленного контроллера.
Например:

public String addCategory(@Valid CategoryAdd category,BindingResult result, 
Map map)

будет работать, тогда как:

public String addCategory(@Valid CategoryAdd category, Map map, 
BindingResult result)

не будет. Я не до конца понимаю, почему это так, особенно если он компилируется без проблем.

0 голосов
/ 13 марта 2012

Итак, полное решение:

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";

Обратите внимание, что я изменил параметр ModelMap с Map, и если в результате обнаружены ошибки, я вернул модель из результата.

Теперь WTF: BindingResult имеет поле objectName, которое имеет значение имени класса. Вы должны установить modelAttribute / commandName для этого. Быть таким же, как objectName в BindingResult, иначе он не будет отображать ошибки. Итак, чтобы соответствовать:

    <form:form modelAttribute="categoryAdd" commandName="categoryAdd"  method="POST" action="add"  >

Кто-нибудь знает, как мы можем изменить objectName из BindingResult? По умолчанию это займет имя класса.

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