SpringBootWeb应用提供500个内部服务器错误,而不是404找不到

uqzxnwby  于 2021-07-16  发布在  Java
关注(0)|答案(1)|浏览(407)

当没有一个学生有一个给定的id时,我怎么能得到404错误?
我的控制器:

  1. @GetMapping("/students/{stu_id}")
  2. private Student_Information getInfo(@PathVariable("stu_id") String stu_id){
  3. Student_Information student = studentInformationService.getStudentById(stu_id);
  4. if(student == null) {
  5. throw new StudentNotFoundException("id"+stu_id);
  6. }
  7. return student;
  8. }

我的异常类:

  1. @ResponseStatus(HttpStatus.NOT_FOUND)
  2. public class StudentNotFoundException extends RuntimeException {
  3. public StudentNotFoundException(String message) {
  4. super(message);
  5. }
  6. }

Postman :{“timestamp”:“2021-03-21t20:50:15.072+00:00”,“status”:500,“error”:“internal server error”,“message”:“,“path”:“/students/stud231”}
来自java的错误:

  1. java.util.NoSuchElementException: No value present
  2. at java.util.Optional.get(Optional.java:135) ~[na:1.8.0_251]
  3. at com.example.demo.services.StudentInformationService.getStudentById(StudentInformationService.java:17) ~[classes/:na]
  4. at com.example.demo.controllers.AppController.getInfo(AppController.java:32) ~[classes/:na]
  5. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_251]
  6. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_251]
  7. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_251]
  8. at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_251]
  9. at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.4.jar:5.3.4]
  10. at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.4.jar:5.3.4]
  11. at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.4.jar:5.3.4]
  12. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.4.jar:5.3.4]
  13. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.4.jar:5.3.4]
  14. at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.4.jar:5.3.4]
  15. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.4.jar:5.3.4]
  16. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.4.jar:5.3.4]
  17. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.4.jar:5.3.4]
  18. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.4.jar:5.3.4]
  19. at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.43.jar:4.0.FR]
  20. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.4.jar:5.3.4]
  21. at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.43.jar:4.0.FR]
  22. at ...
uhry853o

uhry853o1#

这是因为可选的 repository.findById(id) 可以返回 empty ,因此如果对其调用get(),它将抛出 java.util.NoSuchElementException .
你可以用以下方法来解决这个问题: repository.findById(id).orElseGet(null) 或者 repository.findById(id).orElseGet(new Student_Information()) .
4xx错误代码与客户端错误有关,您不应将此作为最佳实践返回。您可以返回200 ok和空响应。
因为资源可用,但是路径变量的记录不存在,所以在这里返回404不是一个好的选择。

相关问题