Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 管理异常_Java_Spring_Exception_Spring Boot - Fatal编程技术网

Java 管理异常

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

我开发了一个应用程序spring boot。我希望管理异常,而不是向客户端发送错误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
        }
    }

你有什么想法吗?

使用控制器建议,我解释:

@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
    对象,因为您正在使用
    @ResponseBody
    它将被序列化为JSON
  • 如果要手动返回JSON响应,则应返回
    String
    而不是
    Person
    ,并正确设置
    内容类型
    标题(使用
    @RequestMapping(products=“application/JSON”
    response.setContentType(“application/JSON”)
我还建议阅读这篇文章,以找到更多在SpringMVC中处理异常的方法


更新:

在这种简单的情况下,您可以对单个字段使用
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
(请参阅)因为不可能从方法返回具有不同类型的对象。