Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可选的SpringWeb空指针异常_Java_Spring Mvc_Nullpointerexception_Optional - Fatal编程技术网

Java 可选的SpringWeb空指针异常

Java 可选的SpringWeb空指针异常,java,spring-mvc,nullpointerexception,optional,Java,Spring Mvc,Nullpointerexception,Optional,我参加了一个关于SpringWeb的公开课程。编写了一些代码来列出数据库中的所有订单,并通过RESTAPI返回它们。这很好用。现在我正在编写一些代码,在请求中给出订单的ID,找到0或1个订单并返回它们。但是,如果没有具有给定ID的Order find,则会给出一个nullpointerexception。我不知道是什么原因造成的。我假设.orElse(null)语句。请告知 控制器: @RequestMapping("api/V1/order") @RestControlle

我参加了一个关于SpringWeb的公开课程。编写了一些代码来列出数据库中的所有订单,并通过RESTAPI返回它们。这很好用。现在我正在编写一些代码,在请求中给出订单的ID,找到0或1个订单并返回它们。但是,如果没有具有给定ID的Order find,则会给出一个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);
    }    
}
@服务
公共类订购服务{
私人最终订单;
@自动连线
公共OrderService(@Qualifier(“oracle”)OrderDao OrderDao){
this.orderDao=orderDao;
}
公共可选getOrderById(int orderNumber){
返回orderDao。选择OrderById(orderNumber);
}    
}
道:

@覆盖
公共可选selectOrderById(整数搜索OrderNumber){
最后一个字符串sql=“从\“订单\”中选择\“订单\”,发送方、接收方、患者、订单日期、截止日期、付款参考、状态、净价,其中\“订单\=?”;
Order Order=jdbcTemplate.queryForObject(sql,新对象[]{searchedOrderNumber},(结果集,i)->{
int orderNumber=resultSet.getInt(“\”order\”);
String sender=resultSet.getString(“sender”);
String receiver=resultSet.getString(“receiver”);
String patient=resultSet.getString(“患者”);
String orderDate=resultSet.getString(“orderDate”);
字符串dueDate=resultSet.getString(“dueDate”);
String paymentRef=resultSet.getString(“paymentRef”);
字符串状态=resultSet.getString(“状态”);
int netPrice=resultSet.getInt(“netPrice”);
返回新订单(订单号、发送者、接收者、患者、订单日期、付款日期、状态、净价);
});
返回可选。不可用(订单);
}

根据有关堆栈跟踪的注释进行编辑

有关您的错误,请检查-

要解决与
orderService相关的问题,getOrderById(id)
返回
null
您可以返回。
ResponseEntity
在状态代码和标题方面为您提供了更大的灵活性。如果可以将代码更改为return
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));
  } 
@GetMapping(path=“{id}”)
公共响应属性getOrderById(@PathVariable(“id”)int-id){
退货订单服务
.getOrderById(id)
.map(order->newresponseEntity(order.getId(),HttpStatus.OK))
.orElse(新响应(未找到HttpStatus));
} 
您甚至可以使用
@ControllerAdvice
编写通用异常处理程序,并将
OrderNotFoundException
作为
.orElse(抛出新的OrderNotFoundException)抛出。查看更多信息

  • 对于Jdbcexception,使用常规查询而不是
    queryForObject
    ,或者使用try/catch转换与Jdbc相关的异常,否则Spring本身将使用ExceptionTranslater、ExceptionHandler等在内部处理这些异常
  • 例如,要在控制器中处理可选的case,只需在那里抛出一个异常 并在最短的时间内处理它

  • stacktrace将提供更多的见解……)org.springframework.dao.EmptyResultDataAccessException:结果大小不正确:org.springframework.dao.support.DataAccessUtils.nullableSingleResult(DataAccessUtils.java:97)~[spring-tx-5.2.8.RELEASE.jar:5.2.8.RELEASE]在org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:784)上应为1,实际为0~[spring-jdbc-5.2.8.RELEASE.jar:5.2.8.RELEASE]在com.example.demo.dao.OrderDataAccessService.selectOrderById(OrderDataAccessService.java:60)~[classes/:na]在com.example.demo.dao.OrderDataAccessService$$FastClassBySpringCGLIB$$65d7a86f.invoke()[classe奇怪的是,它现在不会抛出空指针,但结果大小错误
     @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));
      }