如何配置POJO类以使其可用作JAX-RS rest服务中的资源? (Liferay 7.1)

时间:2019-02-13 08:30:41

标签: rest jax-rs liferay liferay-7 liferay-7.1

我可以在JAX-RS rest服务中使用String对象,但不能使用POJO对象。我应该如何配置POJO类以使其可用作JAX-RS rest服务中的资源?

DTO类

public class RestServiceDTO {
    private String groupId;
    public String getGroupId() {
        return groupId;
    }
    public void setGroupId(String groupId) 
        this.groupId = groupId;
    }
    @Override
    public String toString() {
        return "RestServiceDTO [groupId=" + groupId + "]";
    }
}

其他服务:

@Component(
    immediate = true,
    property = {
        JaxrsWhiteboardConstants.JAX_RS_APPLICATION_BASE + "=/greetings",
    },
    service = Application.class
)
public class RestServiceApplication extends Application {
    public Set<Object> getSingletons() {
        return Collections.<Object>singleton(this);
    }
    @POST
    @Path("/post")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public String test(RestServiceDTO dto) {
        String groupid = dto.getGroupId();
        return "{'groupid':'" + groupid + "'}";
    }
}

错误:

  

2019-02-12 13:33:58.021错误[http-nio-8080-exec-1] [JAXRSUtils:83]否   已找到类com.dto.RestServiceDTO的邮件正文阅读器,   ContentType:application / json

3 个答案:

答案 0 :(得分:0)

Liferay使用JAX-RS的Apache CXF实现。正如注释中提到的@dkb一样,您需要提供示例代码中的注释。

您需要添加依赖项。请参阅下面的列表,请注意,某些是平台提供的,但有些需要包含在jar中,并且不要忘记传递依赖。

      <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-core</artifactId>
            <version>3.0.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
            <version>3.0.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-extension-providers</artifactId>
            <version>3.0.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.7.9</version>
        </dependency>

最后一件事是。您需要在JAX-RS应用程序中注册您的Jackson提供商。例如,可以在应用程序类中完成此操作(有更多方法可以做到)。

@Override
public Set<Object> getSingletons() {
    Set<Object> singletons = new HashSet<>();
    singletons.add(getJacksonProvider());
    return Collections.unmodifiableSet(singletons);
}

答案 1 :(得分:0)

添加依赖项 对于 MAVEN

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.9.10</version>
</dependency>

对于 GRADLE

compileOnly group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: '2.9.10'

现在将此方法添加到您的Apllication类中

private JacksonJsonProvider getJacksonJsonProvider() {

    JacksonJsonProvider jacksonJsonProvider = new JacksonJsonProvider();

    ObjectMapper objectMapper = new ObjectMapper();

    // Prevent serialization of null and empty string values
    objectMapper.setSerializationInclusion(Include.NON_EMPTY);

    jacksonJsonProvider.setMapper(objectMapper);
    jacksonJsonProvider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    return jacksonJsonProvider;
}

现在将您的Application类的getSingletons()方法的代码更改为

@Override
public Set<Object> getSingletons() {

    Set<Object> singletons = new HashSet<>();

    singletons.add(this);

    singletons.add(getJacksonJsonProvider());

    return Collections.unmodifiableSet(singletons);
}

现在我认为您必须将return语句更改为

return Response.ok(JSONFactoryUtil.looseSerializeDeep("{'groupid':'" + groupid + "'}"), MediaType.APPLICATION_JSON).build();

但是我不确定您是否必须更改退货声明,否则您的退货声明会正常运行

答案 2 :(得分:0)

从7.1版开始,Liferay支持OSGi JAX-RS Whiteboard规范,这意味着使用CXF支持JAX-RS 2.1,这也意味着支持JAXB注释的POJO。

如果您需要返回一个简单的POJO,通常只需使用@XmlRootElement注释POJO类即可。

通过在应用程序组件配置中将属性osgi.jaxrs.extension.select=(osgi.jaxrs.name=jaxb-json)放在应用程序组件上,确保对应用程序附加了JAXB运行时支持。

此属性将指示JAX-RS白板在存在扩展程序并为您的应用程序准备就绪之前,不要启动您的应用程序。

从Liferay 7.2开始,JAXB默认实现已更改为Jackson。无需进行任何配置更改,但是现在即使没有注释POJO,每个POJO都可以序列化为JSON。只需确保jaxb运行时支持与上述应用程序一样附加到您的应用程序即可。

在7.1和7.2中,您都可以使用gogo shell命令jaxrs:check

检查JAX-RS应用程序和附加扩展的状态。