我正在尝试为Liferay创建一个REST API模块,但是当我尝试从我的webservices生成JSON响应时,我遇到了问题。
我想生成一个这样的简单JSON:
{
"status": "ok",
"message": "News not found for ID: 5"
}
但相反,这就是我得到的:
{
"parentResponse": {
"status": "ok",
"message": "News not found for ID: 5"
}
}
这是我的POJO课程:
@XmlRootElement
public class ParentResponse {
public String status, message;
public Object item;
public ParentResponse() {
}
public ParentResponse(String status, String message, Object item) {
this.status = status;
this.message = message;
this.item = item;
}
}
我的webservice返回json:
// return a single news based on supplied ID
@GET
@Path("{id}")
@Produces("application/json")
public Response getNewsById(@PathParam("id") String id) {
ResponseBuilder builder;
try {
News news = findById(new Long(id));
if (news != null) {
builder = Response.ok(news);
}
else { // This is my POJO class returned as a JSON
ParentResponse parentResponse = new ParentResponse("ok", "News not found for ID: " + id, null);
builder = Response.status(Response.Status.NOT_FOUND).entity(parentResponse);
}
} catch (Exception e) {
e.printStackTrace();
}
return builder.build();
}
那么,如何在没有root标签的情况下获取JSON?我尝试在@XmlRootElement注释旁边添加(name =“”),但这不起作用。
我建议你使用jackson提供程序来编组/解组json输入/输出(就像我在你的评论中所做的那样):
compile "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.9.0"
compile "com.fasterxml.jackson.core:jackson-annotations:2.9.0"
您的模型应如下所示:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ParentResponse {
@JsonProperty("message")
public String message;
@JsonProperty("status")
public String status;
//...
}
如果你使用Liferay 7,我建议通过创建一个调用你的服务端点(Response getNewsById(@PathParam("id") String id)
)的服务来利用OSGi。当您的OSGi服务启动时,它应该设置jackson提供程序并设置Web服务端点URL ...以及其他任何内容来初始化您的服务。
@Component(immediate = false)
public class WonderfulOsgiService{
private MyWebService myWebService;
public Response getNews( String id) {
return myWebService.getNewsById(id);
}
@Activate
@Modified
private void activate(Map<String, Object> config) {
// Creates jackson provider for marshalling/unmarshalling json
ObjectMapper myMapper = new ObjectMapper();
myMapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
JacksonJsonProvider provider = new JacksonJsonProvider(myMapper);
provider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
List<Object> providers = new ArrayList<>();
providers.add(provider);
//web service endpoint address
String address = "http://my-web-service-address.com/url/"
//MyWebService is the class containing getNewsById(id)
myWebService = JAXRSClientFactory.create(address, MyWebService.class, providers);
}