我正在使用spring-data-jpa存储库进行数据库操作。如果数据库中的对象不存在于我的存储库中的所有方法,我想抛出异常。例如,请考虑OrderRepository
findByCustomerAndPayment(Customer customer, Payment payment);
我想根据customerId和paymentId查询所有订单。这些对象在上述查询中都是必要的。但是如果我在数据库中不存在cutomerId,则spring-data-rest返回null。如果数据库中不存在对象,我希望spring-data-rest抛出异常。
如何实现这一目标?
答案 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);
}
被修改
由于IncorrectResultSizeDataAccessException
为RuntimeException
,因此无需throws
声明 - 我已修复此问题。
答案 2 :(得分:0)
您只需要 orElseThrow
orderRepository.findByCustomerAndPayment(customer, payment).orElseThrow(() -> new ResourceNotFoundException("customer", "id", customer.getId()));
答案 3 :(得分:0)
将 Optional
与 orElseThrow
一起使用。
Order findByCustomerAndPayment(Customer customer, Payment payment);
default Order findByCustomerAndPaymentOrThrow(Customer customer, Payment payment) {
return Optional.ofNullable(findByCustomerAndPayment(customer, payment)).orElseThrow();
};