2

我正在开发一个 Spring MVC 应用程序并且在验证时遇到了问题。我需要创建一个用户,这是一个 2 步过程(意味着 2 个具有相同控制器的 jsps)。jsps 有 2 个不同的命令名。因此,当我为第一个模型创建验证器并对其进行初始化时,第一页加载正常。对于测试,我没有使用 if 条件,而是转发到下一页。当控制器尝试使用当前的 commandName 对象加载验证器时出现错误,但它失败了。

当我输入 url http://ip:port/data时,页面加载,因为没有验证,它只是初始加载当我尝试提交页面而不输入 firstName 并提交时,方法 @RequestMapping(value = "/user") 被调用,并且应该加载下一页 2。但是第2页失败了。

binder.getTarget() prints UserData the first time which is right
binder.getTarget() prints userinfo the 2nd time, when the next page is loading and it fails with the error

堆栈跟踪:

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalStateException: Invalid target for Validator [.validator.UserDataValidator@4366febc]: .model.UserInfo@4e3a061b

type Exception report

message Request processing failed; nested exception is java.lang.IllegalStateException: Invalid target for Validator [.validator.UserDataValidator@4366febc]: .model.UserInfo@4e3a061b

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Invalid target for Validator [.validator.UserDataValidator@4366febc]: .model.UserInfo@4e3a061b
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

root cause

java.lang.IllegalStateException: Invalid target for Validator [.validator.UserDataValidator@4366febc]: .model.UserInfo@4e3a061b
    org.springframework.validation.DataBinder.assertValidators(DataBinder.java:516)
    org.springframework.validation.DataBinder.setValidator(DataBinder.java:507)
    .controller.AccountDataController.initBinder(AccountDataController.java:65)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    org.springframework.web.method.annotation.InitBinderDataBinderFactory.initBinder(InitBinderDataBinderFactory.java:62)
    org.springframework.web.bind.support.DefaultDataBinderFactory.createBinder(DefaultDataBinderFactory.java:53)
    org.springframework.web.method.annotation.ModelFactory.updateBindingResult(ModelFactory.java:251)

有关如何处理此问题的任何建议都会有所帮助。有没有办法使这项工作 - 拥有 2 个不同的 commandNames 并尝试使用一个控制器进行验证,或者我是否需要将 commandName 更新为一个对象,并且该对象包含其中的所有类。

e.g.

class Parent{
 UserData UserData;
 UserInfo userInfo;

 getter & setter
} 

我的控制器:

@Controller
@SessionAttributes("userData")
public class AController {

    @Autowired
    @Qualifier("userDataValidator")
    private Validator validator;

    @InitBinder
    private void initBinder(WebDataBinder binder) {

        System.out.println("getTarget: "+binder.getTarget()); ------------ 
        binder.setValidator(validator);
    }

    @RequestMapping(value = "/data", method = RequestMethod.GET)
    public String initForm(Model model){

        UserData userData = new UserData();
        model.addAttribute("userData", userData);
        return "page1";

    }//

    @RequestMapping(value = "/user", method=RequestMethod.POST )
    public String details(Model model, @Validated UserData userData, BindingResult result) {
        *****
        model.addAttribute("userinfo", userinfo);
        return "page2";

    }//
    **EDIT**
    @RequestMapping(value = "/create", method=RequestMethod.POST )
*****************
public String create(Model model, Userinfo userinfo, UserData userData) {

*********************user creation
}
**EDIT**
}

我的 JSP

page1.jsp

<form:form method="POST" action="user" commandName="userData">
    <form:label path="firstName"><b>Name</b></form:label> <br />
    <form:input class="formLabel" path="firstName" />
    ****
</form>

page2.jsp

 <form:form method="POST" action="create" commandName="userinfo">
 ***********fields
 </form>

我的验证器

public class UserDataValidator  implements Validator{

    public boolean supports(Class<?> paramClass) {
        return UserData.class.equals(paramClass);

    }

    public void validate(Object obj, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "valid.firstName");

    }

}

我的模特

UserData.java

public class UserData {

    String firstName;

    getter & setter for firstName

}

让我知道是否需要更多详细信息。谢谢。

4

0 回答 0