2017-12-23 28 views
0

カスタムBeanバリデータを書き、ユーザーインターフェイスのロケールに基づいて検証メッセージを表示しようとしています。私は私のバリデータを登録するためにinitBinderを使用私のコントローラでSpringのValidatorインターフェイスを使用したカスタムBean Validator

@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; 
    } 
} 

私も登録した
@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}); 
     } 
    } 

} 

messageSourceとバリ豆:

はそれをするために、私は次のようなバリデータを作成しました:

@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); 
    } 
} 

なお、検証エラーメッセージはのように表示されますをユーザーインターフェイスに追加します。 LocalValidatorFactoryBeanの検証メッセージソースを設定しても、メッセージソースからメッセージが読み取られないようです。

一方、カスタムバリデータを使用する代わりに@NotNull(message = {myproject.myclass.validation.name})注釈を使用すると、検証エラーメッセージが正しく表示されます。

私は何が欠けているのか分からなかった。

答えて

0

はmessageSourceファイルのこの

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

既に試してみましたが動作しませんでした – Furkan

0

チェックエンコーディングを試してみてください。それはutf-8でなければなりません。

関連する問題