返回目录 在REST Web服务

问题描述 投票:1回答:4

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

{[...]}

json rest cxf
4个回答
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


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;
    }

}

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" />

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;
}

0
投票

你可以尝试使用杰克逊图书馆编写的项目列表作为字符串

返回新ObjectMapper()writeValueAsString(项目)。

© www.soinside.com 2019 - 2024. All rights reserved.