当前位置: 首页 > 知识库问答 >
问题:

可选的Spring web NullPointer异常

董哲
2023-03-14

我参加了Spring web上的一个公开课。编写了一些代码来列出数据库中的所有订单,并通过rest api返回它们。这工作完美。现在我写一些代码在请求中给出订单的ID,找到0或1个订单并返回它们。但是,当没有找到具有给定ID的订单时,会出现nullpointerexception。我找不出这是什么原因造成的。我假设。orElse(null)语句。请指导

控制器:

@RequestMapping("api/V1/order")
@RestController
public class OrderController {

    private final OrderService orderService;

    @Autowired
    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }
        
    @GetMapping(path = "{id}")
    public Order getOrderById(@PathVariable("id") int id) {
        return orderService.getOrderById(id)
                .orElse(null);
    }   
}

服务:

@Service
public class OrderService {

    private final OrderDao orderDao;

    @Autowired
    public OrderService(@Qualifier("oracle") OrderDao orderDao) {
        this.orderDao = orderDao;
    }

    public Optional<Order> getOrderById(int orderNumber) {
        return orderDao.selectOrderById(orderNumber);
    }    
}

刀:

@Override
public Optional<Order> selectOrderById(int searchedOrderNumber) {
    final String sql = "SELECT \"order\", sender, receiver, patient, orderdate, duedate, paymentref, status, netprice from \"ORDER\" where \"order\" = ?";
    Order order = jdbcTemplate.queryForObject(sql, new Object[] {searchedOrderNumber}, (resultSet, i) -> {
        int orderNumber = resultSet.getInt( "\"order\"");
        String sender = resultSet.getString("sender");
        String receiver = resultSet.getString("receiver");
        String patient = resultSet.getString("patient");
        String orderDate = resultSet.getString("orderdate");
        String dueDate = resultSet.getString("duedate");
        String paymentRef = resultSet.getString("paymentref");
        String status = resultSet.getString("status");
        int netPrice = resultSet.getInt("netprice");
        return new Order(orderNumber,sender,receiver,patient,orderDate,dueDate,paymentRef,status,netPrice);
    });

    return Optional.ofNullable(order);
}

共有2个答案

司寇瑾瑜
2023-03-14

基于关于堆栈跟踪的注释进行编辑

对于您的错误,请检查- Jdbctemplate查询字符串:EmptyResultDataAccessException:不正确的结果大小:应为1,实际为0

要解决与< code > orderservice . getorderbyid(id)返回< code>null相关的问题,您可以返回ResponseEntity。< code>ResponseEntity在状态代码和标题方面为您提供了更多的灵活性。如果您可以更改您的代码以返回< code>ResponseEntity,那么您可以这样做

 @GetMapping(path = "{id}")
  public ResponseEntity<?> getOrderById(@PathVariable("id") int id) {
    return orderService
        .getOrderById(id)
        .map(order -> new ResponseEntity<>(order.getId(), HttpStatus.OK))
        .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
  } 

您甚至可以使用@ControllerAdvice编写通用异常处理程序,并将“订单不发现”异常“作为 .orElse(抛出新的”不发现异常“)。请在此处查看更多信息。

海嘉赐
2023-03-14
  1. 对于 Jdbcexception,请使用常规查询而不是查询对象,或者使用 try/catch 来转换与 Jdbc 相关的异常,否则 Spring 本身将使用异常翻译器、异常处理程序等在内部处理这些异常。
  2. 要处理控制器中的可选情况,只需在那里引发异常,例如后控制器.java#L63 并在后例外处理程序中处理它。
 类似资料:
  • 我有一个api控制器操作,其中包含一个可选(且为空)参数。如果方法签名中存在此参数,则生成Swagger文档将失败,但如果将其从签名中删除,则生成成功。似乎可选参数是错误的原因,但我不知道为什么... 我正在使用Swashbuckle与ASPNET-API-Versioning的集成:https://github.com/microsoft/ASPNET-API-Versioning/wiki/S

  • 我有以下方法: 租户数据库服务。findTenantById(tenantId)返回可选的: 当为null时,我希望抛出异常。相反,我看到正在抛出: 有什么帮助吗?

  • 是否可以使用可选选项重写以下内容?在我看来,当情况需要抛出异常时,使用可选可能不是一个好主意? 尝试1: 尝试2:

  • 问题内容: 我有一本有值的字典,我叫它来填充一个字段 如代码中所示,userdata [“ email”]存在并有一个值,由println打印,无论如何,在下一行中,我引发了一个nil可选异常(甚至不使用默认的“”值) 我看不到我在做什么错 问题答案: 它是文本字段的出口,但在prepareForSegue函数中似乎没有解包 那句话暴露出你的误解。事情按顺序发生,我在这里讨论:https : //

  • 我有一个这样的方法。 这里 我想将这个KException转换为MyException。有没有一个优雅的方法来做这件事?请帮帮忙。