我参加了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);
}
基于关于堆栈跟踪的注释进行编辑
对于您的错误,请检查- 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(抛出新的”不发现异常“)。
请在此处查看更多信息。
查询对象
,或者使用 try/catch 来转换与 Jdbc 相关的异常,否则 Spring 本身将使用异常翻译器、异常处理程序等在内部处理这些异常。我有一个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。有没有一个优雅的方法来做这件事?请帮帮忙。