2016-05-28 8 views
0

注釈を使用してREST Beanに追加の検証ロジックを追加しようとしています。これは単なる例ですが、注釈は複数のRESTリソースオブジェクト/ DTOで使用される点です。私はこのようなソリューションを期待していたカスタム注釈のSpring REST検証

public class Entity { 

    @NotNull // JSR-303 
    private String name; 

    @Phone // Custom phonenumber that has to exist in a database 
    private String phoneNumber; 
} 

@Component 
public class PhoneNumberValidator implements Validator { // Spring Validator 

    @Autowired 
    private PhoneRepository repository; 

    public boolean supports(Class<?> clazz) { 
     return true; 
    } 

    public void validate(Object target, Errors errors) { 
     Phone annotation = // find fields with annotations by iterating over target.getClass().getFields().getAnnotation 
     Object fieldValue = // how do i do this? I can easily get the annotation, but now I wish to do a call to repository checking if the field value exists. 
    } 
} 

答えて

0

あなたが休止状態バリ例えば のようなJSR 303 Beanのバリデータの実装を試してみましたそれから私は、SCOPE =プロトタイプを持っているPhoneValidatorの@Component実装を持つ

@Bean 
LocalValidatorFactoryBean configurationPropertiesValidator(ApplicationContext context, AutowireCapableBeanFactory factory) { 
    LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean(); 
    factoryBean.setConstraintValidatorFactory(factory(context, factory)); 
    return factoryBean; 
} 

private ConstraintValidatorFactory factory(final ApplicationContext context, final AutowireCapableBeanFactory factory) { 
    return new ConstraintValidatorFactory() { 
     @Override 
     public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) { 
      if (RestValidator.class.isAssignableFrom(key)) { 
       return context.getBean(key); 
      } else { 
       return factory.createBean(key); 
      } 
     } 

     @Override 
     public void releaseInstance(ConstraintValidator<?, ?> instance) { 
      if (!(instance instanceof RestValidator<?, ?>)) { 
       factory.destroyBean(instance); 
      } 
     } 
    }; 
} 

@Bean 
WebMvcConfigurerAdapter webMvcConfigurerAdapter(final LocalValidatorFactoryBean validatorFactoryBean) { 
    return new WebMvcConfigurerAdapter() { // Adds the validator to MVC 
     @Override 
     public Validator getValidator() { 
      return validatorFactoryBean; 
     } 
    }; 
} 

public interface RestValidator<A extends Annotation, T> extends ConstraintValidator<A, T> 
public interface PhoneValidator extends RestValidator<PhoneNumber, String> 

@Target(FIELD) 
@Retention(RUNTIME) 
@Constraint(validatedBy = PhoneValidator.class) // This usually doesnt work since its a interface 
public @interface PhoneNumber { 
    // JSR-303 required fields (payload, message, group) 
} 


public class Person { 

@PhoneNumber 
    private String phoneNumber; 
} 

MavenのモジュールB:ここhttp://www.codejava.net/frameworks/spring/spring-mvc-form-validation-example-with-bean-validation-api

+0

ええ、私が理解している限り、JSR-303の方法を使用する場合、Spring管理Beanは使用できません。例えば。リポジトリをバリデーターに挿入する – LG87

+0

できます。注釈を検証するDTOに追加するには、例を見てください。 –

+0

この例ではカスタムアノテーションは提供されていません。私が見る限り、JSR-303注釈を使用して検証を行います。しかし、追加の注釈を作成したい場合は、それを行うことができますが、Springバリデータではなく、JSR-303バリデータを作成します。 例:http://goldenpackagebyanuj.blogspot.no/2013/05/custom-jsr-303-validation-using-constraintValidator.html しかし、そのカスタムにリポジトリを挿入する場合はどうすればよいですかConstraintValidator? – LG87

0

MavenのモジュールA提供されています。

私はこのソリューションが嫌いですが、SpringはデフォルトでInterfaceの実装を調べるべきですが、私よりもはるかに賢い人がいないと決定しました。

関連する問題