如何在REST Web服务返回的字符串列表
我使用CXF 2.7.8
我有一个方法:
@GET
@Path("/items")
@Produces(MediaType.APPLICATION_JSON)
public List<String> getItems() {
List<String> list = service.getList();
return list;
}
为“无正文作家已经发现了响应类的ArrayList。”我收到错误
选项1
我也曾尝试使用GenericEntity>并得到了同样的错误如上
选项2
我也创建包装类列表,
@XmlRootElement(name = "listWarpper")
public class ListWarpper implements Serializable {
private static final long serialVersionUID = 1L;
private List<String> list;
public ListWarpper() {
}
public ListWarpper( List<String> list ) {
this.list = list;
}
public List<String> getList() {
return list;
}
public void setList( List<String> list ) {
this.list = list;
}
}
它工作正常,但只与它的问题是当结果只有一个项目到列表然后返回JSON是
{ list: "Only one Item"}
而不是`{名单:“只有一个项目”]}
我的问题是我怎么能得到的,如果列表为空或只包含一个元素如下无论形式返回JSON
{ list : [...]}
或{[...]}
搜索了一段时间后,我发现选项2的解决方案。
我需要配置“serializeAsArray”和“arrayKeys”。
我我的情况如下
<property name="serializeAsArray" value="true" />
<property name="arrayKeys">
<list>
<value>list</value>
</list>
</property>
您可以创建JAXB如下。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"mylist"
})
@XmlRootElement(name = "kplist")
public class Kplist {
@XmlElement(required = true)
protected List<String> mylist;
public List<String> getMylist() {
if (mylist == null) {
mylist = new ArrayList<String>();
}
return this.mylist;
}
}
object factory.Java
@XmlRegistry
public class ObjectFactory {
public ObjectFactory() {
}
public Kplist createKplist() {
return new Kplist();
}
}
package-info.Java
@javax.xml.bind.annotation.XmlSchema(namespace = "", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.kp.schema;
CX-bean.xml
<jaxrs:server id="KPService" address="/KPApp">
<jaxrs:serviceBeans>
<ref bean="kpBean" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
<property name="dropRootElement" value="true" />
<property name="dropCollectionWrapperElement" value="false" />
<property name="ignoreNamespaces" value="true" />
<property name="convention" value="mapped" />
<property name="unmarshallAsJaxbElement" value="true" />
<property name="writeXsiType" value="false" />
<property name="readXsiType" value="false" />
<property name="serializeAsArray" value="true" />
<property name="arrayKeys">
<list>
<value>mylist</value>
</list>
</property>
</bean>
<ref bean="schemaGen" />
</jaxrs:providers>
<jaxrs:features>
<cxf:logging />
</jaxrs:features>
</jaxrs:server>
<bean id="kpBean" class="com.rest.KPResource"></bean>
<bean id="schemaGen" class="org.apache.cxf.jaxrs.model.wadl.WadlGenerator">
<property name="linkJsonToXmlSchema" value="true" />
<property name="schemaLocations">
<list>
<value>classpath:/json.schema</value>
</list>
</property>
<property name="useJaxbContextForQnames" value="true" />
<property name="ignoreMessageWriters" value="false" />
<property name="addResourceAndMethodIds" value="true" />
</bean>
**Test**
Kplist list = new Kplist();
list.getMylist().add("KP5");
return list;
**output**
{"kp1":["KP5"]}
**Note:**
下面财产滴根场
<property name="dropRootElement" value="false" />
什么是如果你正在创建一个ListWrapper但不能使用的地步。在您get函数试试这个
@GET
@Path("/items")
@Produces(MediaType.APPLICATION_JSON)
public ListWarpper getItems() {
List<String> list = service.getList();
ListWarpper l = new ListWarpper ();
l.setList(list);
return l;
}
你可以尝试使用杰克逊图书馆编写的项目列表作为字符串
返回新ObjectMapper()writeValueAsString(项目)。