Java 数据库更新后运行的PUT和修补程序的Spring数据rest验证

Java 数据库更新后运行的PUT和修补程序的Spring数据rest验证,java,spring,hibernate,spring-boot,spring-data-rest,Java,Spring,Hibernate,Spring Boot,Spring Data Rest,我有一个SDR项目,我正在成功验证POST请求的用户实体,但只要我使用补丁或PUT更新现有实体,数据库就会在执行验证之前更新(正在执行验证程序并返回错误,但数据库仍在更新) 我是否需要为更新设置单独的配置?我是不是错过了一个额外的步骤 实体 存储库 我认为您应该重命名验证器,例如,将其重命名为MemberValidator,然后按如下所述分配: 但我建议您使用,而不是您的自定义验证器。要在SDR项目中使用它,您可以插入LocalValidatoryFactoryBean,然后在Configure

我有一个SDR项目,我正在成功验证POST请求的用户实体,但只要我使用补丁或PUT更新现有实体,数据库就会在执行验证之前更新(正在执行验证程序并返回错误,但数据库仍在更新)

我是否需要为更新设置单独的配置?我是不是错过了一个额外的步骤

实体 存储库
我认为您应该重命名验证器,例如,将其重命名为
MemberValidator
,然后按如下所述分配:

但我建议您使用,而不是您的自定义验证器。要在SDR项目中使用它,您可以插入
LocalValidatoryFactoryBean
,然后在
ConfigureValidationRepositoryEventListener
中为“beforeCreate”和“beforeSave”事件分配它:

@Configuration
@RequiredArgsConstructor // Lombok annotation
public class RepoRestConfig extends RepositoryRestConfigurerAdapter {

    @NonNull private final LocalValidatorFactoryBean validatorFactoryBean;

    @Override
    public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener v) {
        v.addValidator("beforeCreate", validatorFactoryBean);
        v.addValidator("beforeSave", validatorFactoryBean);
        super.configureValidatingRepositoryEventListener(v);
    }
}
在这种情况下,您的SDR将自动验证所有公开SDR存储库的POST、PUT和PATCH请求的有效负载


有关更多详细信息,请参阅my。

我认为您应该将验证器重命名为
MemberValidator
,然后按说明分配它:

但我建议您使用,而不是您的自定义验证器。要在SDR项目中使用它,您可以插入
LocalValidatoryFactoryBean
,然后在
ConfigureValidationRepositoryEventListener
中为“beforeCreate”和“beforeSave”事件分配它:

@Configuration
@RequiredArgsConstructor // Lombok annotation
public class RepoRestConfig extends RepositoryRestConfigurerAdapter {

    @NonNull private final LocalValidatorFactoryBean validatorFactoryBean;

    @Override
    public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener v) {
        v.addValidator("beforeCreate", validatorFactoryBean);
        v.addValidator("beforeSave", validatorFactoryBean);
        super.configureValidatingRepositoryEventListener(v);
    }
}
在这种情况下,您的SDR将自动验证所有公开SDR存储库的POST、PUT和PATCH请求的有效负载


有关更多详细信息,请参阅我的。

不要忘记接受/投票支持帮助您的答案…我遇到了同样的问题,您最终解决了吗?不要忘记接受/投票支持帮助您的答案…我遇到了同样的问题,您最终解决了吗?我使用了这种方法,但它没有解决问题。你有什么建议吗?我正在使用这种方法,但它并没有解决问题。你有什么建议吗?
@Component
public class BeforeSaveMemberValidator implements Validator {

    public BeforeSaveMemberValidator() {}

    private String EMAIL_REGEX = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";

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

    @Override
    public void validate(Object target, Errors errors) {
        Member member = (Member) target;

        if(ObjectUtils.isEmpty(member.getFirstName())) {
            errors.rejectValue("firstName", "member.firstName.empty");
        }

        if(ObjectUtils.isEmpty(member.getLastName())) {
            errors.rejectValue("lastName", "member.lastName.empty");
        }

        if(!ObjectUtils.isEmpty(member.getDni()) && !member.getDni().matches("^[a-zA-Z0-9]*$")) {
            errors.rejectValue("dni", "member.dni.invalid");
        }

        if(!ObjectUtils.isEmpty(member.getEmail()) && !member.getEmail().matches(EMAIL_REGEX)) {
            errors.rejectValue("email", "member.email.notValid");
        }
    }
}
@Service
@RepositoryEventHandler(Member.class)
public class MemberService {

    @HandleBeforeCreate
    @HandleBeforeSave
    @Transactional
    public void beforeCreate(Member member) {
        ...
    }

}
@Override
protected void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener v) {
  v.addValidator("beforeCreate", new MemberValidator());
  v.addValidator("beforeSave", new MemberValidator());
}
@Configuration
@RequiredArgsConstructor // Lombok annotation
public class RepoRestConfig extends RepositoryRestConfigurerAdapter {

    @NonNull private final LocalValidatorFactoryBean validatorFactoryBean;

    @Override
    public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener v) {
        v.addValidator("beforeCreate", validatorFactoryBean);
        v.addValidator("beforeSave", validatorFactoryBean);
        super.configureValidatingRepositoryEventListener(v);
    }
}