java接口反序列化

2vuwiymt  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(516)

我有一个响应对象,它总是包含响应对象作为属性和不同类型的值,因此我在类中有一个接口作为字段,这样它就可以基于一些唯一的值标识符带来正确的实现。

  1. Could not execute the callcom.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class com.opngo.nowos.nowos.api.response.DataResponse]: missing type id property 'operation' (for POJO property 'response')
  2. at [Source: (okhttp3.ResponseBody$BomAwareReader); line: 1, column: 180] (through reference chain: com.opngo.nowos.nowos.NowOSResponse["response"])

这是我的界面

  1. @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "operation")
  2. @JsonSubTypes({@JsonSubTypes.Type(value = AuthResponse.class, name = "account_auth")})
  3. public interface IResponse {
  4. ///
  5. }

下面是实现上述接口的响应对象之一

  1. @RequiredArgsConstructor
  2. public class AuthResponse implements IResponse {
  3. @JsonProperty
  4. private final String accountID;
  5. @JsonProperty
  6. private final String authToken;
  7. @JsonProperty
  8. private final String language;
  9. }

下面是主响应,它有一个接口,该接口应该带来正确的响应对象

  1. public class NowOSResponse {
  2. @JsonProperty
  3. private final String operation;
  4. @JsonProperty
  5. private final String version;
  6. @JsonProperty
  7. private final IResponse response;
  8. @JsonProperty
  9. private final String status;
  10. }

它看起来不查看父级并在authresponse中搜索operation字段,这当然是空的,因为operation字段总是存在于父级中,并且父级有response->authresponse->createacassponse等等

nwlqm0z1

nwlqm0z11#

我想张贴一个解决方案,希望能帮助你。
如果对象中的某个对象总是返回不同的属性,则可以使用以下方法:
1) 创建一个抽象类,例如mainresponse,该响应将包含状态和操作,因为该属性是常量

  1. public abstract class MainResponse {
  2. @JsonProperty
  3. private String version;
  4. public abstract IResponse getResponse(); // so we declaring it abstract so that all the childrens have to override it in order to return specific interface realisation
  5. }

现在我们必须创建一个特定的响应体,它应该基于api调用返回。

  1. @Getter
  2. @JsonIgnoreProperties(ignoreUnknown = true)
  3. public class AuthResponse implements IResponse {
  4. @JsonProperty
  5. private String accountID;
  6. @JsonProperty
  7. private String authToken;
  8. }

既然json需要response json属性,我们就必须创建一个额外的类来扩展抽象类,这意味着我们将有需要ireresponse作为返回的getresponse,因此我们在authresponse中实现了这个接口,我们可以简单地将authresponse归纳为一个新的(比如说newresponse)类中的组合对象并返回它。

  1. @Getter
  2. public class NewResponse extends MainResponse {
  3. @JsonProperty
  4. private AuthResponse response;
  5. }
展开查看全部

相关问题