Spring CRUD:如何处理null?

时间:2017-02-10 11:37:40

标签: java spring spring-data-jpa

我目前使用Spring(Boot)CrudRepository接口来获取我的Hibernate实体,在这个问题的上下文中findOne(Long id)方法。

只要我不用null作为id调用它,这一切都可以正常工作,在这种情况下,生成的方法以NullPointerException终止。现在我可以轻松地围绕该函数扭曲另一个类来处理它,但这有点无视自动CRUD系统的概念。

有没有办法让生成的Spring代码以null返回而不是异常的方式处理null ID?

更清楚:我有代码包围,以防止异常。问题是具体是否有一种 Spring 方式来处理它而不是围绕它包装代码。

1 个答案:

答案 0 :(得分:-1)

没有

看看the doc

  

抛出:IllegalArgumentException - 如果id为null

findOne的逻辑很简单:

  • 如果找不到具有指定标识的对象
  • ,则返回null 如果调用者不知道id(即调用者给出null参数),它会抛出异常。

问题在于代码调用' 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();
    }

}