8

Spring3.1.2.RELEASEを使用しています。日付フィールドが適切にフォーマットされていない場合、JSPにエラーメッセージを表示したい。私はすべての正しい手順に従ったと思いました。コントローラーにコンバーターをバインダーします…</p>

@InitBinder
public void initBinder(final WebDataBinder binder) {
    final DateFormat dateFormat = new SimpleDateFormat(Contract.DATE_FORMAT);
    dateFormat.setLenient(false);

    // true passed to CustomDateEditor constructor means convert empty String to null
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
...
}

これらのエラーメッセージをmessages.propertiesファイル(Springアプリケーションコンテキストに含まれています)に含めました

typeMismatch.activationDate=The activation date format should be of the form MM/dd/yyyy
typeMismatch.sampleUserForm.activationDate=The activation date format should be of the form MM/dd/yyyy

これが私が使用しているモデルです:

public class SampleUserForm
{

    private String userId;
    private String firstName;
    private String middleName;
    private String lastName;
    private String username;
    private String url;
    private String password;
    private String confirmPassword;
    private State state;
    private java.util.Date activationDate;
    private java.util.Date expirationDate;
    private List<Product> products;
    private Set<Role> roles = new HashSet<Role>();

日付の形式が適切でないフォームを送信すると、次のエラーメッセージが表示されます…</ p>

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'sampleUserForm' on field 'activationDate': rejected value [1900]; codes [typeMismatch.sampleUserForm.activationDate,typeMismatch.activationDate,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [sampleUserForm.activationDate,activationDate]; arguments []; default message [activationDate]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'activationDate'; nested exception is java.lang.IllegalArgumentException: Could not parse date: Unparseable date: "1900"]
    org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:111)
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75)
    org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)

正しくフォーマットされていない日付をトラップするには、他に何をする/チェックする必要がありますか?ページが優雅に死ぬのではなく、ユーザーにわかりやすいエラーメッセージを表示したいと思います。

フォームを処理することになっているコントローラーメソッドは次のとおりです。BindingResultがすでに含まれていることに注意してください。

@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView save(final HttpServletRequest request,
                         final SampleUserForm sampleUserForm,
                         final Model model,
                         final BindingResult result) 
{
    String nextPage = "sampleusers/add";
    m_sampleUserFormValidator.validate(sampleUserForm, result);
    if (!result.hasErrors())
    {
       ... process the model and determine the next page ...
    }   // if 

    return new ModelAndView(nextPage);
}
4

6 に答える 6

6

POSTを使用してフォームをメソッドの1つにバインドする必要があると思います@ModelAttribute。同じメソッドでバインドaを実行するBindingResult bindingResultと、すべてのバインドエラーがこのbindingResultオブジェクトにキャプチャされます。メソッド内で、次のことを確認できるはずです。

if (bindingResult.hasErrors()) {

適切な行動を取る。

于 2013-03-25T18:36:08.580 に答える
6

参照:Spring @Validバリデーターが正しく呼び出されない(Roo、Hibernate)

短編小説は、コントローラーメソッドのシグネチャをから変更しています

@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView save(final HttpServletRequest request,
                     final SampleUserForm sampleUserForm,
                     final Model model,
                     final BindingResult result)

@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView save(final HttpServletRequest request,
                         final Model model,
                         final SampleUserForm sampleUserForm,
                         final BindingResult result) 

すべてを修正しました。

于 2013-04-04T21:39:20.947 に答える
1

エラーはデータをフォーマットするときだと思います。アプリケーションをデバッグし、日付の値を確認する必要があることを確認します。また、別の良い習慣は、アプリケーションの標準形式を構成していると信じることです。

以下の例に従ってください。

 @Configuration
 public class ApplicationContext {

    @Bean
    public FormattingConversionService conversionService() {

            // Use the DefaultFormattingConversionService but do not register
            // defaults
            DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);

            // Ensure @NumberFormat is still supported
            conversionService.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory());

            // Register date conversion with a specific global format
            DateFormatterRegistrar registrar = new DateFormatterRegistrar();
            registrar.setFormatter(new DateFormatter("dd/MM/yyyy")); // define your format
            registrar.registerFormatters(conversionService);

            return conversionService;
    }
  }
于 2013-04-03T17:16:57.247 に答える
0

そのコントローラークラスのメソッドに、このクラス/メソッドレベルのアノテーションを付けます。

@ExceptionHandler(BindException.class)
public String handleBindExcption(/*flexible parameters*/ ){
    //codes goes here
    return "view"; //view name or modelAndView 
}

詳細_

于 2013-03-30T02:54:06.073 に答える
0
`class DateBinderImpl` extends PropertyEditorSupport {



 public void setAsText(String text)
        throws IllegalArgumentException
    {
if(text.isEmpty()){

        Datelistener dateString = new Datelistener ();
        dateString.setValue("");
        setValue(dateString); setValue is method of PropertyEditorSupport
return;
    }
// for other date check condition use SimpleDateFormat class

public String getAsText()
    {
        Datelistener dateString = (Datelistener) getValue();
        if(dateString.getDate.isEmpty()){
            return "";

}


public class   Datelistener {
private String date;
public Datelistener ()
    {

    }
//setter and getter for date;

}

public class TestModel{
  private Datelistener date;
// gettter and setter for date




}
@InitBinder
 public void initBinder(WebDataBinder binder)
    {
        binder.registerCustomEditor(Datelistener, new DateBinderImpl());

    }

private boolean checkClientSideValidation(TestModel model, BindingResult bindingResult) {
Datelistener  dateobject=model.getDate(); // now you can obtained binded date value.
dateobject.getDate().isEmpty(){
 bindingResult.rejectValue("date;", "", new Object[] {""}, "");
            return true;
}

詳細については、このリンクを参照して くださいhttp://forum.springsource.org/showthread.php?58933-Handle-excpetions-from-custom-property-editor-spring-2-5 http://www.codercorp.com/ blog / spring / registering-propertyeditorss-with-spring-for-custom-objects-example.html

于 2013-04-03T11:17:44.253 に答える
0

BindingResult引数は、検証されるモデルの横にある必要があります。例えば

 public void checkout(
                         @Valid @ModelAttribute("legalContactDetails") LegalContactDetails legalContactDetails,
                         BindingResult legalContactDetailsResult,
                         @Valid @ModelAttribute("researchIntent") ResearchIntent researchIntent,
                         BindingResult researchIntentResult)
于 2015-01-13T17:55:49.683 に答える