如何使用jersey编写REST API方法以使用json对象的json格式

问题描述

我有一个myObject pojo和类型为myObject的列表,如下所示:

public static final GenericType<List<myObject>> myObjectList = new GenericType<List<myObject>>() {};

下面是用来打RestClient类中的rest api的方法:

public <P> List<P> getAllOriginal(String resourcePath,GenericType<List<P>> entityType) {
        Objects.requireNonNull(this.baseUri,"target cannot be null");
        return this.client
                .target(this.baseUri)
                .path(resourcePath)
                .request(MediaType.APPLICATION_JSON_TYPE)
                .cookie("mySSO",getCookie())
                .get()
                .readEntity(entityType);
    }

这就是我试图获取数据的方式:

list = restClient.getAllOriginal("myObject",myObjectList).
                    stream().map(PojoAction::new).collect(Collectors.toList());

以下是我从REST API收到的json:

  {
  
  "myObject" : [ {
    "key" : {
      "srcSys" : "REPO_1","srcSysRef" : "20200909_1911_1"
    },"productData" : {
      "id" : null,"number" : null,"isn" : null,"productId" : null,"productAdditionalData" : {
        "assetClassTree" : "UNCLASSIFIED","description" : "UNCLASSIFIED","productTypeData" : {
          "productType" : "UNCLASSIFIED","productGroup" : "UNCLASSIFIED"
        }
      }
    },"state" : "OPEN","type" : "01"
  },{
    "key" : {
      "srcSys" : "REPO_2","srcSysRef" : "20200403_3892_1"
    },"productData" : {
      "id" : "1","number" : "11","isn" : "null","productId" : 1234,"productAdditionalData" : {
        "assetClassTree" : "xyz","description" : "abc","tradAcctType" : "01"
  } ]
  }

错误:

Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList<com.gs.liquidity.pojo.cash.CommitmentPojo>` out of START_OBJECT token
 at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1,column: 1]
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) ~[jackson-databind-2.10.1.jar:2.10.1]
    at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1442) ~[jackson-databind-2.10.1.jar:2.10.1]
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1216) ~[jackson-databind-2.10.1.jar:2.10.1]
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1168) ~[jackson-databind-2.10.1.jar:2.10.1]
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:332) ~[jackson-databind-2.10.1.jar:2.10.1]
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:265) ~[jackson-databind-2.10.1.jar:2.10.1]
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245) ~[jackson-databind-2.10.1.jar:2.10.1]
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27) ~[jackson-databind-2.10.1.jar:2.10.1]
    at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1682) ~[jackson-databind-2.10.1.jar:2.10.1]
    at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:977) ~[jackson-databind-2.10.1.jar:2.10.1]
    at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:814) ~[jackson-jaxrs-base-2.10.1.jar:2.10.1]
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256) ~[jersey-common-2.25.1.jar:?]
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:235) ~[jersey-common-2.25.1.jar:?]
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155) ~[jersey-common-2.25.1.jar:?]
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085) ~[jersey-common-2.25.1.jar:?]
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874) ~[jersey-common-2.25.1.jar:?]
    ... 34 more

我的分析: 我了解此错误是由于数据不匹配造成的。我正在尝试获取列表,但api给了我对象。但是我不确定如何获取对象,因为我是REST和jersey的新手。我试图用Google搜索,但找不到任何重要信息。 您能指导我介绍一些文档或任何示例吗?

我发现了一些相关的问题: How to write a REST API method for which consume json format for list of objects

但是我在使用外部api时无法修改REST API的输出。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)