Spring RestController 将错误返回为 html 而不是 json

use*_*529 9 java spring spring-mvc spring-security spring-boot

我有一个 spring boot webapp,我在其中定义了 REST API。我正在使用 Spring Security 来保证 REST API 安全。

我用 RestController 注释了我的控制器类。我最近将 spring boot、mvc 和 security 更新到最新版本。

我现在看到在我的负面情况下,在更新之前它返回 json 错误响应,但现在更新后,它返回 html 错误响应。

在更新之前,它给出了以下错误响应-

{
  "timestamp": "2018-05-21T18:22:37.105+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "Error message.",
  "path": "<API path>"
}
Run Code Online (Sandbox Code Playgroud)

更新后,它给出了以下响应。

<!DOCTYPE html>
<html>
    <head>
        <title>Apache Tomcat/8.0.51 - Error report</title>
        <style type="text/css">H1 {font-family:Tahoma,Arial,sansserif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style>
    </head>
    <body>
        <h1>HTTP Status 500 - Error message.</h1>
        <div class="line"></div>
        <p>
            <b>type</b> Status report
        </p>
        <p>
            <b>message</b>
            <u>Error message.</u>
        </p>
        <p>
            <b>description</b>
            <u>The server encountered an internal error that prevented it from fulfilling this request.</u>
        </p>
        <hr class="line">
        <h3>Apache Tomcat/8.0.51</h3>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我的控制器中没有任何 ExceptionHandler。默认情况下,它是 json 错误。我的库中有 jackson 和 jackson-mapper-asl。

我不知道某处是否有默认设置需要更改以将错误作为 json 发送。

我也尝试禁用 ErrorPageFilter 但即使在那之后我也收到了 HTML 响应。

有什么方法可以让我得到 json 响应而不是 html?

小智 1

我认为您缺少控制器将产生的响应类型。

将其添加到您的端点:

@ResponseBody
@RequestMapping(value="/xyz", produces="application/json")
public String XYZ() {
    // Your Code Goes Here
    return  return new JSONObject("{'aa':'bb'}");
}
Run Code Online (Sandbox Code Playgroud)

检查这些帖子:Returning JSON response from springcontroller gets as htmlrather of JSON in javascriptReturning JSON object as response in Spring Boot