我目前使用Spring(Boot)CrudRepository接口来获取我的Hibernate实体,在这个问题的上下文中findOne(Long id)
方法。
只要我不用null作为id调用它,这一切都可以正常工作,在这种情况下,生成的方法以NullPointerException终止。现在我可以轻松地围绕该函数扭曲另一个类来处理它,但这有点无视自动CRUD系统的概念。
有没有办法让生成的Spring代码以null
返回而不是异常的方式处理null
ID?
更清楚:我有代码包围,以防止异常。问题是具体是否有一种 Spring 方式来处理它而不是围绕它包装代码。
答案 0 :(得分:-1)
没有
看看the doc。
抛出:IllegalArgumentException - 如果id为null
findOne的逻辑很简单:
问题在于代码调用' findOne',所以你应该尝试修复它。
(问题改变后编辑)。
(请注意,这不是一个" Spring方式"更改存储库的行为,它是"方式"将包装代码移动到较低级别)
您可以查看AOP with Spring。
您可以使用@Advice @Around findOne方法来捕获IllegalArgumentException(甚至更好:测试null arg并立即返回null)。
这样的事情:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;
@Aspect
public class AroundExample {
@Around("com.xyz.myapp.MyRepository.findOne() && args(id)")
public Object hackFindOne(ProceedingJoinPoint pjp, Object id) throws Throwable {
if(id==null) return null;
return pjp.proceed();
}
}