gpt4 book ai didi

java - Jersey Rest - JsonMappingException : No suitable constructor found for type [simple type, 类]

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:01:30 26 4
gpt4 key购买 nike

我使用 jax-rs 和 jersey 创建了一个 REST API。我想从我的 REST API 中的外部库返回一个 JSON 格式的对象。但是这个对象没有没有默认构造函数,这会导致以下异常:

Caused by: org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class ....EncryptionToken]: can not instantiate from JSON object (need to add/enable type information?) 

通过 REST API 返回此对象的最佳方式是什么?

这是我的 REST API 实现:

@GET
@Produces(MediaType.APPLICATION_JSON)
public javax.ws.rs.core.Response get( //
@QueryParam("etkIdentifierType") String etkIdentifierType, //
@QueryParam("etkIdentifierValue") String etkIdentifierValue, //
@QueryParam("applicationId") String applicationId) {
LOG.info("GET Request: Lookup encryption token for etkIdentifierType [" + etkIdentifierType + "], etkIdentifierValue [" + etkIdentifierValue + "] and applicationId [" + applicationId + "]");
final EncryptionToken token = etkService.getETK(etkIdentifierType, etkIdentifierValue, applicationId);
return Response.ok(token).build();
}

加密类来 self 无法修改的外部库。我首先尝试用相同的变量构造一个自己的对象并返回它,但并不是所有的 getter 方法都是公共(public)的。

这是 EncryptionToken 类:

package ...;

public class EncryptionToken {
private java.security.cert.X509Certificate encrCert;
private byte[] encoded;
private java.security.cert.X509Certificate authCert;
private java.security.cert.X509Certificate etkRaCert;
private java.util.List<java.security.cert.X509Certificate> caCertChain;

EncryptionToken(byte[] encoded, java.security.cert.X509Certificate encrCert, java.security.cert.X509Certificate authCert, java.util.List<java.security.cert.X509Certificate> caCertChain, java.security.cert.X509Certificate etkRaCert) { /* compiled code */ }

public final byte[] getEncoded() { /* compiled code */ }

public final byte[] getBase64Encoded() { /* compiled code */ }

public final java.security.cert.X509Certificate getCertificate() { /* compiled code */ }

public final java.security.cert.X509Certificate getAuthenticationCertificate() { /* compiled code */ }

java.util.List<java.security.cert.X509Certificate> getCaCertChain() { /* compiled code */ }

java.security.cert.X509Certificate getEtkRaCert() { /* compiled code */ }
}

编辑:我认为对于我的情况我需要一个反序列化器。代码在以下行失败:

final EncryptionToken encryptionToken = response.getEntity(EncryptionToken.class);

但是因为我不能实例化一个 EncryptionToken(没有默认构造函数并且可用的构造函数不是公共(public)的)我不知道如何解决这个问题......

最佳答案

您可以实现自定义 JsonSerializer 对象并将其注册到 Jackson 上下文中。

public class EncryptionTokenSerializer extends JsonSerializer<EncryptionToken> {
@Override
public void serialize(EncryptionToken value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
jgen.writeStartObject();
jgen.writeBinaryField("encoded", value.getEncoded());
jgen.writeBinaryField("base64Encoded", value.getBase64Encoded());
jgen.writeEndObject();
}
}

如果您想知道如何在上下文中注册序列化程序,请查看 this answer

关于java - Jersey Rest - JsonMappingException : No suitable constructor found for type [simple type, 类],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28582068/

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