Java 可选的SpringWeb空指针异常
我参加了一个关于SpringWeb的公开课程。编写了一些代码来列出数据库中的所有订单,并通过RESTAPI返回它们。这很好用。现在我正在编写一些代码,在请求中给出订单的ID,找到0或1个订单并返回它们。但是,如果没有具有给定ID的Order find,则会给出一个nullpointerexception。我不知道是什么原因造成的。我假设.orElse(null)语句。请告知 控制器: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
@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
在状态代码和标题方面为您提供了更大的灵活性。如果可以将代码更改为returnResponseEntity
,则可以执行以下操作
@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));
}