如何在spring数据jpa中抛出搜索方法的异常

时间:2016-10-04 10:09:00

标签: spring spring-boot spring-data-jpa spring-data-rest

我正在使用spring-data-jpa存储库进行数据库操作。如果数据库中的对象不存在于我的存储库中的所有方法,我想抛出异常。例如,请考虑OrderRepository

中的以下方法
findByCustomerAndPayment(Customer customer, Payment payment);

我想根据customerId和paymentId查询所有订单。这些对象在上述查询中都是必要的。但是如果我在数据库中不存在cutomerId,则spring-data-rest返回null。如果数据库中不存在对象,我希望spring-data-rest抛出异常。

如何实现这一目标?

4 个答案:

答案 0 :(得分:5)

如果您使用的是Java 8,则可以使用Optional<Order>作为存储库方法的返回类型。如果存储库方法返回空的Optional调用get,则会抛出NoSuchElementException。否则,如果没有结果,则不支持通过存储库方法抛出异常。

try {
  Optional<Order> result = repository.findByCustomerAndPayment(customer,payment);
  Order order = result.get();
} catch(NoSuchElementException e) {
  // do something with the exception
}

答案 1 :(得分:4)

您可以按如下方式进行自定义存储库实现:

public interface OrderRepositoryCustom {
    Order findByCustomerAndPaymentRequired(Customer customer, Payment payment);
}

public class OrderRepositoryImpl implements OrderRepositoryCustom {

    @Autowired 
    OrderRepository orderRepository;

    @Override
    public Order findByCustomerAndPaymentRequired(Customer customer, Payment payment) {
        Order o = orderRepository.findByCustomerAndPayment(customer, payment);
        if(o == null) {
            throw new IncorrectResultSizeDataAccessException(1);
        }
        return o;
    }

}

您的OrderRepository界面应该自定义:

public interface OrderRepository extends CrudRepository<Order, Long>, OrderRepositoryCustom {
    Order findByCustomerAndPayment(Customer customer, Payment payment);
}

被修改

由于IncorrectResultSizeDataAccessExceptionRuntimeException,因此无需throws声明 - 我已修复此问题。

答案 2 :(得分:0)

您只需要 orElseThrow

orderRepository.findByCustomerAndPayment(customer, payment).orElseThrow(() -> new ResourceNotFoundException("customer", "id", customer.getId()));

答案 3 :(得分:0)

OptionalorElseThrow 一起使用。

Order findByCustomerAndPayment(Customer customer, Payment payment);

default Order findByCustomerAndPaymentOrThrow(Customer customer, Payment payment) {
    return Optional.ofNullable(findByCustomerAndPayment(customer, payment)).orElseThrow();
};