2

Spring MVC アプリケーションに取り組んでおり、検証に問題があります。ユーザーを作成する必要があり、それは 2 ステップのプロセスです (つまり、同じコントローラーで 2 つの jsps)。jsps には 2 つの異なる commandNames があります。したがって、最初のモデルのバリデーターを作成して初期化すると、最初のページが正常に読み込まれます。テストのために、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)

これを処理する方法についての提案は役に立ちます。これを機能させる方法はありますか?

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