Java 数据库更新后运行的PUT和修补程序的Spring数据rest验证
我有一个SDR项目,我正在成功验证POST请求的用户实体,但只要我使用补丁或PUT更新现有实体,数据库就会在执行验证之前更新(正在执行验证程序并返回错误,但数据库仍在更新) 我是否需要为更新设置单独的配置?我是不是错过了一个额外的步骤 实体 存储库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
我认为您应该重命名验证器,例如,将其重命名为
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);
}
}