Java 管理异常
我开发了一个应用程序spring boot。我希望管理异常,而不是向客户端发送错误500 我想这样做:Java 管理异常,java,spring,exception,spring-boot,Java,Spring,Exception,Spring Boot,我开发了一个应用程序spring boot。我希望管理异常,而不是向客户端发送错误500 我想这样做: @RequestMapping(value = "/testRest", method = RequestMethod.GET) public @ResponseBody Person tst(HttpServletResponse response) { try { return ldapService.getUserByPrimaryKey
@RequestMapping(value = "/testRest", method = RequestMethod.GET)
public @ResponseBody Person tst(HttpServletResponse response) {
try {
return ldapService.getUserByPrimaryKey("tst@ts.com");
} catch (Exception e) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return (Person) "{\"ERROR\": \" + e.getMessage() +\"}"; // This not work
}
}
你有什么想法吗?使用控制器建议,我解释:
@ControllerAdvice
public class MyExceptionsHandlerController{
@ExceptionHandler(Exception.class)
@ResponseBody Person handleException(){
//do what you want
}
}
请注意,使用
Exception
太通用了,您应该更加细化要处理的异常类型 这样做:
public static class Person{
//other fields
public String error = null;
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
}
@RequestMapping(value = "/testRest", method = RequestMethod.GET)
public @ResponseBody Person tst(HttpServletResponse response) throws Exception {
try {
return ldapService.getUserByPrimaryKey("tst@ts.com");
} catch (Exception e) {
Person person = new Person();
person.setError("{\"ERROR\": " + e.getMessage() +"}");
return person;
}
}
如果您不想发回500,请不要这样做:
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
在java中,您也不能将字符串强制转换为Person类
返回(Person)“{\”错误\”:\“+e.getMessage()+\”}”;//这不管用
这不起作用,因为您试图将String
对象强制转换为Person
类型。我相信它甚至不应该编译
有两种方法可以解决此问题:
- 返回
对象,因为您正在使用Person
它将被序列化为JSON@ResponseBody
- 如果要手动返回JSON响应,则应返回
而不是String
,并正确设置Person
标题(使用内容类型
或@RequestMapping(products=“application/JSON”
)response.setContentType(“application/JSON”)
更新: 在这种简单的情况下,您可以对单个字段使用
Map
:
public @ResponseBody Map<String, String> tst(HttpServletResponse response) {
...
return Collections.singletonMap("ERROR": e.getMessage());
public@ResponseBody映射tst(HttpServletResponse){
...
返回Collections.singletonMap(“错误”:e.getMessage());
谢谢@tsolak Peteosian,这意味着我必须在每个对象中添加一个字段错误,该字段错误将在catch部分中设置。您的建议是可行的,但生成的JSON看起来会很奇怪,因为error
成员将不包含错误字符串,而是包含错误的JSON。只是不要使用花括号。这只是f的问题设置错误。我想要的是当ok时返回Person对象,当它不ok时,例如错误500,我将返回类似于{“error”:“异常详细信息”}的JSOn。您应该在描述中提到这一点。在这种情况下,您必须使用类似于@AdviceController
(请参阅)因为不可能从方法返回具有不同类型的对象。