Java Spring-如何修复HttpMessageNotWritableException无限递归JSON响应?

Java Spring-如何修复HttpMessageNotWritableException无限递归JSON响应?,java,json,spring,http,spring-boot,Java,Json,Spring,Http,Spring Boot,因此,我在java spring中有一个简单的方法,它将类作为ResponseBody返回: @RequestMapping(value = "update", method = RequestMethod.PUT) public @ResponseBody JKResponse update() { return new JKResponse(); } JKResponse类如下所示: @JsonAutoDetect(fieldVisibility = JsonAutoDetect.

因此,我在java spring中有一个简单的方法,它将类作为ResponseBody返回:

@RequestMapping(value = "update", method = RequestMethod.PUT)
public @ResponseBody JKResponse update() {
    return new JKResponse();
}
JKResponse类如下所示:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, 
                isGetterVisibility = JsonAutoDetect.Visibility.ANY,
                getterVisibility = JsonAutoDetect.Visibility.ANY)
public class JKResponse implements Serializable {
    static final long serialVersionUID = 1L;

    @JsonProperty
    private List<String> stuff;

    public JKResponse() {
        this.stuff = new ArrayList<String>();
    }

    public void setStuff(final List<String> stuff) {
        this.stuff = stuff;
    }

    public List<String> getStuff() {
        return this.stuff;
    }

    /*
       THIS METHOD IS CAUSING THE INFINITE RECURSION, BUT WHY?
    */
    public ResponseEntity<JResponse> getResponseEntity() {
        return new ResponseEntity<JResponse>(this, HttpStatus.OK);
    }
}
邮递员中显示的JSON是:

{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body":{"responseEntity":{"headers":{},"body": and so on...

我不知道是什么原因造成的,为什么会这样。有什么建议吗?

您通常不需要向用户发送ResponseEntity,ResponseEntity是您用来告诉Spring应该返回给用户什么的数据对象。应该这样使用:

@RequestMapping(value = "update", method = RequestMethod.PUT)
public ResponseEntity<JKResponse> update () {
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("Boiling", "True");
    return new ResponseEntity<JKResponse>(
            new JKResponse(), responseHeaders, HttpStatus.I_AM_A_TEAPOT);
}

你可能需要给我们更多的信息。我尝试了you's代码,它对我来说很有用。哦,我实际上知道了为什么会发生这种情况(我编辑了上面的类,并添加了一个getResponseEntity方法,这就是问题所在)…出于某种原因,返回新的ResponseEntity(这个,HttpStatus.OK),会导致无限递归。为什么会发生这种情况?因为它试图递归地序列化实体。要序列化对象,它必须从中获取所有属性,然后从其属性中获取所有属性,然后从其属性的属性中获取所有属性,依此类推。因为其中一个属性是实体本身,所以这永远不会结束。还有其他方法可以做我想做的事情吗?我不知道你想做什么:-)
@RequestMapping(value = "update", method = RequestMethod.PUT)
public ResponseEntity<JKResponse> update () {
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("Boiling", "True");
    return new ResponseEntity<JKResponse>(
            new JKResponse(), responseHeaders, HttpStatus.I_AM_A_TEAPOT);
}
$ curl -X PUT -i 127.0.0.1:8080/update
HTTP/1.1 418 
Server: Apache-Coyote/1.1
Boiling: True
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Tue, 29 Dec 2015 20:03:51 GMT

{"stuff":[]}