我在一个物体上有一个重载的二传手,我怎么能告诉杰克逊忽略其中一个呢?

时间:2022-01-20 07:17:39

I'm using Jersey 1.17 with com.sun.jersey.api.json.POJOMappingFeature set to true and I'm POSTing an object that looks like this:

我正在使用Jersey 1.17,com.sun.jersey.api.json.POJOMappingFeature设置为true,我正在发布一个如下所示的对象:

import com.fasterxml.jackson.annotation.JsonIgnore;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
public class ByteArrayWithOverloadedSetterObject {

    private byte[] data;

    public void setData(byte[] data) {
        this.data = data;
    }

    @XmlTransient
    @JsonIgnore
    public void setData(String data) {
        this.data = data.getBytes();
    }

    public byte[] getData() {
        return data;
    }
}

My Resource has this method:

我的资源有这个方法:

@POST
@Path("postByteArrayWithOverloadedSetterObject")
public byte[] sendByteArrayWithOverloadedSetterObject(ByteArrayWithOverloadedSetterObject byteArrayWithOverloadedSetterObject) {
    if (byteArrayWithOverloadedSetterObject.getData() == null) {
        log.warn("data was null!");
    }
    return byteArrayWithOverloadedSetterObject.getData();
}

And my client side unit tests are written like this:

我的客户端单元测试是这样编写的:

@Test
public void whenSendingStringDataThenGetDataBack() {
    ByteArrayWithOverloadedSetterObject byteArrayWithOverloadedSetterObject = new ByteArrayWithOverloadedSetterObject();
    byteArrayWithOverloadedSetterObject.setData("foobar");
    byte[] data = new AuthClient().postJaxbToUrl(RestApiUriBuilder.TEST_REST_PATH + "/postByteArrayWithOverloadedSetterObject", byteArrayWithOverloadedSetterObject, byte[].class);
    assertNotNull(data);
}

@Test
public void whenSendingByteDataThenGetDataBack() {
    ByteArrayWithOverloadedSetterObject byteArrayWithOverloadedSetterObject = new ByteArrayWithOverloadedSetterObject();
    byteArrayWithOverloadedSetterObject.setData(new byte[]{0, 1, 1, 0});
    byte[] data = new AuthClient().postJaxbToUrl(RestApiUriBuilder.TEST_REST_PATH + "/postByteArrayWithOverloadedSetterObject", byteArrayWithOverloadedSetterObject, byte[].class);
    assertNotNull(data);
}

Both of these tests are failing with a message that says "postByteArrayWithOverloadedSetterObject returned a response status of 204 No Content" and the server is logging "data was null!" for each. Why isn't the byte array data being serialized over the wire? I'm sending this as JSON.

这两个测试都失败了,消息显示“postByteArrayWithOverloadedSetterObject返回的响应状态为204 No Content”,服务器正在记录“data was null!”为每个人。为什么不通过线路对字节数组数据进行序列化?我发送这个作为JSON。

If I comment out the @XmlTransient/@JsonIgnore annotations, I get this error: "java.lang.RuntimeException: Conflicting setter definitions for property "data"".

如果我注释掉@ XmlTransient / @JsonIgnore注释,我会收到此错误:“java.lang.RuntimeException:属性”data“”的冲突setter定义。

In my real situation, I can't easily modify the API of ByteArrayWithOverloadedSetterObject. But since this is just a test, I can see that things work correctly if I rename the second setter and the object becomes this:

在我的实际情况中,我无法轻易修改ByteArrayWithOverloadedSetterObject的API。但由于这只是一个测试,我可以看到,如果我重命名第二个setter并且对象变成了这个,那么事情就能正常工作:

import com.fasterxml.jackson.annotation.JsonIgnore;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
public class ByteArrayWithOverloadedSetterObject {

    private byte[] data;

    public void setData(byte[] data) {
        this.data = data;
    }

    @XmlTransient
    @JsonIgnore
    public void setData2(String data) {  //RENAME HERE.  Now tests pass.
        this.data = data.getBytes();
    }

    public byte[] getData() {
        return data;
    }
}

Since I can't change the API of ByteArrayWithOverloadedSetterObject, is there any other work around to this?

由于我无法更改ByteArrayWithOverloadedSetterObject的API,还有其他解决方法吗?

1 个解决方案

#1


4  

This is the solution:

这是解决方案:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
public class ByteArrayWithOverloadedSetterObject {

    private byte[] data;

    @JsonProperty //I ADDED THIS
    public void setData(byte[] data) {
        this.data = data;
    }

    @XmlTransient
    @JsonIgnore
    public void setData(String data) {
        this.data = data.getBytes();
    }

    public byte[] getData() {
        return data;
    }
}

Now my tests pass.

现在我的测试通过。

#1


4  

This is the solution:

这是解决方案:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
public class ByteArrayWithOverloadedSetterObject {

    private byte[] data;

    @JsonProperty //I ADDED THIS
    public void setData(byte[] data) {
        this.data = data;
    }

    @XmlTransient
    @JsonIgnore
    public void setData(String data) {
        this.data = data.getBytes();
    }

    public byte[] getData() {
        return data;
    }
}

Now my tests pass.

现在我的测试通过。