【问题标题】:Return List<String> in REST Web ServiceREST Web 服务中的返回列表<String>
【发布时间】:2014-02-12 22:12:23
【问题描述】:

如何在 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 找到消息正文编写器。”

选项一

我也尝试过使用 GenericEntity> 并得到与上面相同的错误

选项 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 : ["Only one Item"]}

我的问题是,无论列表是空的还是只包含一个元素,我如何才能以如下形式返回 json

{ list : [...]}

{[...]}

【问题讨论】:

标签: json rest cxf


【解决方案1】:

经过一段时间的搜索,我找到了选项 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】:

    您可以按如下方式创建 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();
        }
    
    }
    

    包信息.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" />
    

    【讨论】:

      【解决方案3】:

      如果您正在创建 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;
      }
      

      【讨论】:

        【解决方案4】:

        您可以尝试使用 Jackson Library 将项目列表写为字符串

        return new ObjectMapper().writeValueAsString(items);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多