gpt4 book ai didi

java - 我在一个物体上有一个重载的二传手,我怎么能告诉 jackson 忽略其中一个?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:45 25 4
gpt4 key购买 nike

我正在使用 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;
}
}

我的资源有这个方法:

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

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

@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);
}

这两个测试都失败了,并显示一条消息“postByteArrayWithOverloadedSetterObject 返回了 204 无内容的响应状态”并且服务器正在记录“数据为空!”对于每个。为什么不通过网络对字节数组数据进行序列化?我将其作为 JSON 发送。

如果我注释掉 @XmlTransient/@JsonIgnore 注释,我会得到这个错误:“java.lang.RuntimeException: Conflicting setter definitions for property “data”” .

在我的真实情况下,我不能轻易修改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;
}
}

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

最佳答案

这是解决方案:

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;
}
}

现在我的测试通过了。

关于java - 我在一个物体上有一个重载的二传手,我怎么能告诉 jackson 忽略其中一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24192931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com