web-dev-qa-db-ja.com

Spring-Data-Rest Validator

私は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/peopleURLにPOSTすると何らかのエラーが発生することが予想されます。ただし、エラーはスローされず、バリデーターが呼び出されることはありません。

また、spring-data-restドキュメントのセクション5.1に示されているように、バリデーターを手動でセットアップしてみました。

何が足りないのですか?

18

したがって、「保存」の前後のイベントは、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());
    }
}
13

この機能は現在実装されていないようです(2.3.0)。残念ながら、イベント名の定数はありません。そうでない場合、以下の解決策はそれほど脆弱ではありません。

Configurationは、適切なイベントを使用して、適切に名前が付けられたすべてのValidatorBeanを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()));
        }
    }
}
3
Andreas

暗闇の中でのちょっとした刺し傷-私は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();
    }
}
1
Muel