2017-12-23 12 views
0

Ich versuche, einen benutzerdefinierten Bean-Validator zu schreiben und Validierungsnachrichten basierend auf dem Gebietsschema auf der Benutzeroberfläche anzuzeigen.Benutzerdefinierter Bean-Validator mit Validator-Schnittstelle von Spring

, das zu tun, habe ich ein Validator wie folgt aus:

@Component 
public class MyCustomValidator implements Validator { 

    @Override 
    public boolean supports(Class<?> clazz) { 
     return MyClass.class.equals(clazz); 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 
     MyClass myObject = (MyClass)target; 

     if (StringUtils.isBlank(myObject.getName())) {   
      errors.rejectValue("name", "{myproject.myclass.validation.name}); 
     } 
    } 

} 

Ich habe auch Message und Validator Bohnen registriert:

@Configuration 
@ComponentScan(basePackages = "com.mycompany.myproject") 
public class MyProjectWebMvcConfig { 

    @Bean 
    public MessageSource messageSource() { 
     ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 

     messageSource.addBasenames("locale/myproject"); 

     messageSource.setDefaultEncoding("UTF-8"); 
     return messageSource; 
    } 

    @Bean 
    public LocalValidatorFactoryBean validator() { 
     LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); 
     validator.setValidationMessageSource(this.messageSource()); 
     return validator; 
    } 
} 

In meinem Controller ich initBinder verwendet, um meine Validatoren zu registrieren:

@RestController 
@RequestMapping("/api/mytype") 
public class MyController extends MyBaseController { 

    @Autowired 
    private MyCustomValidator myCustomValidator; 

    @InitBinder 
    protected void initBinder(WebDataBinder binder) { 
     super.initBinder(binder); 
     binder.addValidators(this.myCustomValidator); 
    } 

    @PostMapping(value = "/") 
    public ResponseEntity<OperationResult<Void>> save(@Valid @RequestBody MyClass myObject, BindingResult bindingResult, HttpServletRequest request) { 
     if (!bindingResult.hasErrors()) { 
      ... 
     } 
     ... 
    } 
} 

public class MyBaseController { 

    @Autowired 
    protected Validator validator; 

    @InitBinder 
    protected void initBinder(WebDataBinder binder) { 
     binder.setValidator(validator); 
    } 
} 

Dennoch erscheinen Validierungsfehlermeldungen wie {myproject.myclass.validation.name} auf der Benutzeroberfläche. Es scheint, als ob Nachrichten nicht aus messageSource gelesen werden, selbst wenn ich die Validierungsnachrichtenquelle LocalValidatorFactoryBean eingestellt habe.

Wenn ich andererseits @NotNull(message = {myproject.myclass.validation.name}) Annotation anstelle eines benutzerdefinierten Validators verwenden, wird die Validierungsfehlermeldung korrekt angezeigt.

Konnte nicht herausfinden, was ich vermisse.

Antwort

0

diese

errors.rejectValue("name", "myproject.myclass.validation.name"); 
+0

Bereits versucht, das hat aber nicht funktioniert – Furkan

0

prüft Codierung von Message Dateien Versuchen. Es sollte utf-8 sein.

Verwandte Themen