【问题标题】:Can't send json response on POST request in Spring MVC controller无法在 Spring MVC 控制器中对 POST 请求发送 json 响应
【发布时间】:2019-01-18 18:40:50
【问题描述】:

我可以轻松发送对象列表以响应 POST 请求并在 VueJs 客户端中接收它

@RequestMapping(value={"/data/parts"}, method = RequestMethod.POST)
@ResponseBody public List<Part> getPartsList( @RequestBody LookupForm lookupForm ) {
        return getService().findParts(lookupForm.getCode(), lookupForm.getName(), lookupForm.getWarehouseCode());
}

但是当我尝试使用自定义类 Response 进行响应时(我什至在 RequestMapping 注释中添加了produces="application/json"

@RequestMapping(value={"/addPartsRequest"}, method = {RequestMethod.POST}, produces="application/json")
    @ResponseBody public Response addPartsRequest(@RequestBody PartsRequest partsRequest) {
        Response response = new Response("Fail","Your Request failed");
        PartsRequest newRequest = getService().addPartsRequest(partsRequest);
        if (newRequest != null){
            response = new Response("Ok", "The Ticket has been submitted.");
        }
        return response;
}

class Response {
    String message;
    String status;

    public Response() {
        // empty c-tor for serialization
    }

    public Response(String status, String message) {
        this.message = message;
        this.status = status;
    }
    // ... getters & setters omitted
    }

在 axios.post 的帮助下发送的 VueJ 端请求

var headers = {
            'Content-Type': 'application/json'
      }
      axios.post(`${API_URL.orderApi}`, formData, {headers})
        .then(response => {
          const commitPayload = response.data.message;
          const status        = response.data.status;
          if(status === 'Ok'){
              this.$store.commit('setMessage', commitPayload)
          }else{
              this.$store.commit('setErrMessage', commitPayload)
          }
          this.$router.push('/parts')
        },
        error => {
          this.$store.commit('setErrMessage', 'Submit Order failed')
          this.$router.push('/parts')
        })

Vue UI 客户端接收

Status Code: 406 Not Acceptable
Content-Type: text/html;charset=UTF-8
<html><head><title>Error</title></head><body>Not Acceptable</body></html>

为什么我可以用对象列表响应而不能用 POJO 响应以及如何解决这个问题? 谢谢。

PS。项目依赖 jackson-databind v2.8.2 和 spring v4.3.1

【问题讨论】:

    标签: json spring-mvc vue.js jackson jackson-databind


    【解决方案1】:

    当我从邮递员那里得到响应时,我得到了正确的响应。我相信你有 getter 和 setter。

    使用标头 Accept: application/json

    将类标记为可序列化的实现。

    【讨论】:

    • 是的,为了清楚起见,我在代码 sn-p 中标记了 getter 和 setter。我在发布问题后添加了class Response implements Serializable。还是不行。
    • 你有没有尝试 VueJs 中的标头 Accept: application/json
    • 我真的不明白如果服务器已经响应406 Not Acceptable,这个`Accept: application/json in VueJs`将如何改善情况?即客户端已经收到错误,无论它准备好接受 json。
    • 你是否添加了这些依赖项。 org.codehaus.jacksonjackson-core-asl1.9.13org.codehaus .jacksonjackson-mapper-asl1.9.13
    • 感谢您的帮助。我找到了原因并发布了答案。
    【解决方案2】:

    事实证明,我正在将带有 json 正文的 POST 请求发送到映射到带有后缀“htm”的 url 的控制器。此请求与 mime-mapping 'text/html' 冲突,结果服务器立即响应代码 406。

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      相关资源
      最近更新 更多