如何在扩展 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
- 必须实施解决方法,或者手动注册验证器
我正在扩展 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
- 必须实施解决方法,或者手动注册验证器