如何在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&gt;并得到与上面相同的错误
选项2
我还为列表创建了Wrapper类
@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"}
而不是`{list:[“只有一个项目”]}
我的问题是,无论list是空还是只包含一个元素,我怎样才能以如下形式返回json
{ list : [...]}
或{[...]}
答案 0 :(得分:0)
您可以按如下方式创建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;
}
}
ObjectFactory.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" />
答案 1 :(得分:0)
在搜索了一段时间后,我找到了选项2的解决方案。
我需要配置“serializeAsArray”和“arrayKeys”。
我的情况如下
<property name="serializeAsArray" value="true" />
<property name="arrayKeys">
<list>
<value>list</value>
</list>
</property>
答案 2 :(得分:0)
如果您正在创建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;
}
答案 3 :(得分:0)
您可以尝试使用Jackson Library将项目列表编写为字符串
返回新的ObjectMapper()。writeValueAsString(items);