私はspring-data-restプロジェクトにspringバリデーターを追加しようとしています。
私はこのリンクを介して「はじめに」アプリケーションをフォローし、セットアップしました: http://spring.io/guides/gs/accessing-data-rest/
...そして今、私はここのドキュメントに従ってカスタムPeopleValidatorを追加しようとしています: http://docs.spring.io/spring-data/rest/docs/2.1.0.RELEASE/reference/html /validation-chapter.html
私のカスタムPeopleValidatorは次のようになります
package hello;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
public class PeopleValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return true;
}
@Override
public void validate(Object target, Errors errors) {
errors.reject("DIE");
}
}
...そして私のApplication.Javaクラスは次のようになります
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public PeopleValidator beforeCreatePeopleValidator() {
return new PeopleValidator();
}
}
PeopleValidatorがすべてを拒否しているため、http://localhost:8080/people
URLにPOSTすると何らかのエラーが発生することが予想されます。ただし、エラーはスローされず、バリデーターが呼び出されることはありません。
また、spring-data-restドキュメントのセクション5.1に示されているように、バリデーターを手動でセットアップしてみました。
何が足りないのですか?
したがって、「保存」の前後のイベントは、PUTとPATCHでのみ発生するようです。 POSTすると、前後の「作成」イベントが発生します。
configureValidatingRepositoryEventListener
オーバーライドを使用して手動で再試行しましたが、機能しました。職場と自宅で何をしているのかわかりません。明日見ないといけない。
なぜそれが機能しないのかについて他の人が提案を持っているかどうか聞いてみたいと思います。
ちなみに、新しいApplication.Javaクラスは次のようになります。
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.rest.core.event.ValidatingRepositoryEventListener;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application extends RepositoryRestMvcConfiguration {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
validatingListener.addValidator("beforeCreate", new PeopleValidator());
}
}
この機能は現在実装されていないようです(2.3.0)。残念ながら、イベント名の定数はありません。そうでない場合、以下の解決策はそれほど脆弱ではありません。
Configuration
は、適切なイベントを使用して、適切に名前が付けられたすべてのValidator
BeanをValidatingRepositoryEventListener
に追加します。
import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.List;
import Java.util.Map;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.rest.core.event.ValidatingRepositoryEventListener;
import org.springframework.validation.Validator;
@Configuration
public class ValidatorRegistrar implements InitializingBean {
private static final List<String> EVENTS;
static {
List<String> events = new ArrayList<String>();
events.add("beforeCreate");
events.add("afterCreate");
events.add("beforeSave");
events.add("afterSave");
events.add("beforeLinkSave");
events.add("afterLinkSave");
events.add("beforeDelete");
events.add("afterDelete");
EVENTS = Collections.unmodifiableList(events);
}
@Autowired
ListableBeanFactory beanFactory;
@Autowired
ValidatingRepositoryEventListener validatingRepositoryEventListener;
@Override
public void afterPropertiesSet() throws Exception {
Map<String, Validator> validators = beanFactory.getBeansOfType(Validator.class);
for (Map.Entry<String, Validator> entry : validators.entrySet()) {
EVENTS.stream().filter(p -> entry.getKey().startsWith(p)).findFirst()
.ifPresent(p -> validatingRepositoryEventListener.addValidator(p, entry.getValue()));
}
}
}
暗闇の中でのちょっとした刺し傷-私はspring-data-rest
を使用していません。ただし、フォローしているチュートリアルを読んだ後、問題はPersonValidator
ではなくPeopleValidator
が必要なことだと思います。それに応じてすべての名前を変更します。
PersonValidator
package hello;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
public class PersonValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return true;
}
@Override
public void validate(Object target, Errors errors) {
errors.reject("DIE");
}
}
アプリケーション
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public PersonValidator beforeCreatePersonValidator() {
return new PersonValidator();
}
}