今天在写志愿插入时,要先判断志愿表中是否有该学生的志愿条目,测试时出现java.util.NoSuchElementException: No value present错误
代码如下
Expectation expectationById = expectationDao.findById(expectation.getStudentId()).get();
if(expectationById != null){
log.info("志愿已存在");
return ResponseResult.FAILED("请勿重复提交志愿!");
}
报错代码
[2020/06/25-23:04:21] [http-nio-8181-exec-1] [ERROR] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet]] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.util.NoSuchElementException: No value present] with root cause
java.util.NoSuchElementException: No value present
查阅资料,算是搞清了这个问题的由来,JPA在调用findById并get时,如果没有查到数据,就会报这个错误。因此不能在get后判断是否为空,要在其之前调用一个.isPresent()方法判断是否有数据。修改后代码如下:
Optional<Expectation> result = expectationDao.findById(expectation.getStudentId());
if(result.isPresent()){
log.info("志愿已存在");
return ResponseResult.FAILED("请勿重复提交志愿!");
}
先用一个Optional<实体>去接收返回结果,然后直接调用.isPresent方法来判断是否为空.当然,也可以用一个三元表达式赋值然后再判断
Optional<Expectation> result = expectationDao.findById(expectation.getStudentId());
Expectation expectationById = result.isPresent()?result.get():null;
if(expectationById != null){
log.info("志愿已存在");
return ResponseResult.FAILED("请勿重复提交志愿!");
}
测试,这里选择一个已经存在于表中的条目去插入,返回结果如下
{
"success": false,
"code": 40000,
"message": "请勿重复提交志愿!",
"data": null
}