REST Web服务中的返回列表<string> </string>

时间:2014-02-12 22:12:23

标签: json rest cxf

如何在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 : [...]}

{[...]}

4 个答案:

答案 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> 

更多细节 http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-DealingwithJettisonarrayserializationissues

答案 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);