我可以在JAX-RS rest服务中使用String对象,但不能使用POJO对象。我应该如何配置POJO类以使其可用作JAX-RS rest服务中的资源?
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
答案 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