我开发了一个应用程序弹簧启动。我用它来管理异常,而不是向客户端发送错误500.
我想做那样的事情:
@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
}
}
你有什么想法吗?
答案 0 :(得分:1)
return(Person)“{\”ERROR \“:\”+ e.getMessage()+ \“}”; //这不起作用
这不起作用,因为您尝试将String
对象转换为Person
类型。它甚至不应该编译我相信。
有两种解决方法:
Person
对象,因为您正在使用@ResponseBody
,它将被序列化为JSON String
而不是Person
,并正确设置Content-Type
标头(使用@RequestMapping(produces = "application/json"
或{ {1}})我还建议阅读Exception Handling in Spring MVC文章,找到更多处理Spring MVC中除外的方法。
更新:
在这种简单的情况下,您可以将response.setContentType("application/json")
与单个字段一起使用:
Map
答案 1 :(得分:0)
使用ControllerAdvice,我解释一下:
@ControllerAdvice
public class MyExceptionsHandlerController{
@ExceptionHandler(Exception.class)
@ResponseBody Person handleException(){
//do what you want
}
}
请注意,使用Exception
过于通用,您应该更多地处理您想要处理的异常类型。
答案 2 :(得分:0)
做这样的事情:
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类。