javax.ws.rs.core.Response 以集合作为实体

javax.ws.rs.core.Response with a collection as entity

我有以下代码:

    @GET
    @Path("v1/entity")
    @ApiOperation(
            value = "List",
            notes = "Enables you to List.",
            tags = { "List" })
    @ApiImplicitParams(
            {
                @ApiImplicitParam(name = "pageSize",
                    value = "Page Size",
                    dataType = "int",
                    paramType = "formData",
                    example = "50"),
                @ApiImplicitParam(name = "sortAscending",
                    value = "Sort Ascending",
                    dataType = "boolean",
                    paramType = "formData",
                    example = "false")
            })
    public Response list(@ApiParam(hidden = true) Integer pageSize,
            @ApiParam(hidden = true) Boolean sortAscending) {
        Collection<EntityData> dataCollection;
        if (pageSize == null || sortAscending == null || pageSize <= 0) {
            dataCollection = storeController.list();
        } else {
            SortDirection sortDirection = sortAscending ? SortDirection.ASC : SortDirection.DESC;
            dataCollection= storeController.list(pageSize, sortDirection);
        }
        logger.info("List contains {} elements", dataCollection.size());
        GenericEntity<Collection<EntityData>> response = new GenericEntity<Collection<EntityData>>(dataCollection){};
        return Response.ok(response).build();
        //return ResponseEntity.ok(dataCollection);
    }

两种方法都来自 storeController 对象 return 一个 ArrayList 的 EntityData,其结构如下:

public class EntityData implements Serializable {

    private String document;

    private String validTo;

    private String validFrom;

    private String entityAlias;

    public String getDocument() {
        return document;
    }

    public void setDocument(String document) {
        this.document= document;
    }

    public String getValidTo() {
        return validTo;
    }

    public void setValidTo(String validTo) {
        this.validTo = validTo;
    }

    public String getValidFrom() {
        return validFrom;
    }

    public void setValidFrom(String validFrom) {
        this.validFrom = validFrom;
    }

    public String getEntityAlias() {
        return entityAlias;
    }

    public void setEntityAlias(String entityAlias) {
        this.entityAlias = entityAlias;
    }
}

当我调用 API 时,出现此错误:

No message body writer has been found for class java.util.ArrayList, ContentType: */*

我用了this as a reference,但是没用。我也尝试过,而不是使用 Response 来检索内容,而是使用 ResponseEntity<Collection<EntityData>>,但错误仍然存​​在。就像在 Response 中直接使用“ArrayList”一样(不在 GenericEntity 上换行)。

如果我将最后一行更改为 return Response.ok().build(); 它可以工作,但我需要检索 Collection ... logger 表示当我运行.

我知道我在这里遗漏了一些东西,但我看不到它。你能帮帮我吗?

确保您的资源方法(或整个资源 class)被注释为:

  • @Produces("applicaton/json") 或;
  • @Produces(MediaType.APPLICATION_JSON).

然后确保您在 class 路径中有 JSON 提供者,例如 Jackson:

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>${jackson.version}</version>
</dependency> 

根据 JAX-RS 实现的配置方式,添加 jackson-jaxrs-json-provider artifact to your classpath is enough to use Jackson as a JSON provider. Otherwise you need to register JacksonJsonProvider