如何在扩展 AbstractRepositoryEventListener 的 class 的 onBeforeSave 注释的方法中中止保存实体?

How can I abort saving an entity within a method annotated with onBeforeSave of a class that extends AbstractRepositoryEventListener?

我正在扩展 AbstractRepositoryEventListener 以创建照片的 md5 散列并将其与对象一起保存。

如果出现异常,我想完全中止保存照片。

@Component
public class MyHandler extends AbstractRepositoryEventListener<Photo> {

    @Autowired
    PhotoService photoService;

    @Override
    public void onBeforeSave(Photo photo) {
        File originalPhoto = new File(foto.getUriOriginal());
        try {
            String hash = photoService.getHash(originalPhoto);
            photo.setHash(hash);
        } catch ( IOException | NoSuchAlgorithmException e ) {
            e.printStackTrace();
        }
    }
}

您可能会抛出一个 RuntimeException 实例。它将 Spring 回滚。

还有其他更全面的方式,详情请见here

如果有人遇到同样的问题,这里有更好的方法。

这里的目标基本上是验证一个实体。

Spring 已经提供了 ValidatingRepositoryEventListener that uses validators 来实现这个目标。不仅会保存"aborted",还会给客户端提供错误信息

重要的是要注意验证器的自动发现似乎有一个错误 with a workaround described here

也可以创建 custom validation annotations,如下面 link 中所述,从而产生更可重用的代码。

在此特定实例中,验证器看起来像这样:

@Component("beforeSavePhotoValidator")
public class PhotoValidator implements Validator {

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

    @Override
    public void validate(Object obj, Errors errors) {
        if (customValidationIsInvalid(obj)){
            errors.rejectValue(
                "<invalidFieldName>",
                "<errorMessageCode>"
            );
        }
    }
}

注意:

  • 应适当实施 customValidationIsInvalid、invalidFieldName 和 errorMessageCode
  • 必须在 ValidationMessages.properties 文件中设置 errorMessageCode
  • 必须实施解决方法,或者手动注册验证器