2017-05-26 61 views
0

我开发了一个应用程序弹簧引导。我用魔杖来管理异常,而不是将错误500发送给客户端。管理异常

我想要做这样的事情:

@RequestMapping(value = "/testRest", method = RequestMethod.GET) 
    public @ResponseBody Person tst(HttpServletResponse response) { 
     try { 
      return ldapService.getUserByPrimaryKey("[email protected]"); 
     } catch (Exception e) { 
      response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
      return (Person) "{\"ERROR\": \" + e.getMessage() +\"}"; // This not work 
     } 
    } 

你有什么想法?

回答

0

使用ControllerAdvice,我解释一下:

@ControllerAdvice 
public class MyExceptionsHandlerController{ 

    @ExceptionHandler(Exception.class) 
    @ResponseBody Person handleException(){ 
    //do what you want 
    } 
} 

注意,使用Exception太普通了,你应该更多的粮食异常的类型要处理。

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("[email protected]"); 
    } catch (Exception e) { 
     Person person = new Person(); 
     person.setError("{\"ERROR\": " + e.getMessage() +"}");   
     return person; 
    } 
} 

正弦你不想发回500不这样做:

response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 

你也不能强制转换成字符串Person类在java中。

+0

感谢@tsolak Peteosian,这意味着我必须在每个对象添加将在catch部分中设置的字段错误 – Victor

+0

您建议的工作原理是什么,但生成的JSON看起来很奇怪,因为“error”成员不会保存错误字符串,而会保存出现错误的json。 –

+0

只是不使用花括号。这只是格式化错误的问题。 – tsolakp

1

return(Person)“{\”ERROR \“:\”+ e.getMessage()+ \“}”; //这是因为你想投String对象到Person类型不行

这是行不通的。它不应该编译我相信。

有如何解决此2种方式:

  • 回报Person对象,因为你使用@ResponseBody,如果你想手动返回一个JSON响应将被序列化到一个JSON
  • ,那么你应该返回String代替Person,并还适当设置Content-Type头(通过使用@RequestMapping(produces = "application/json"response.setContentType("application/json")

我也建议阅读Exception Handling in Spring MVC文章,以找到更多处理Spring MVC中的exceptons的方法。


更新时间:

在这样一个简单的例子,你可以使用一个Map与单场:

public @ResponseBody Map<String, String> tst(HttpServletResponse response) { 
    ... 
    return Collections.singletonMap("ERROR": e.getMessage()); 
+0

我想要的是什么时候可以返回Person对象,当它不正确,例如一个错误500我会返回一个JSOn这样的{“error”:“异常详细信息”} – Victor

+0

你应该在描述中提到。在这种情况下,你必须使用类似'@ AdviceController'的东西(参见https:// spring。io/blog/2013/11/01/exception-handling-in-spring-mvc#using-controllevice-classes),因为不可能从方法返回不同类型的对象。 –