4

我正在使用 CXF 创建宁静的服务。其中一项服务返回一个字符串列表。当我在列表中有多个项目时,CXF 返回一个字符串数组,但是当我只有一个元素时,它返回字符串而不是一个带有 json 的数组:

一件物品:

 {"ImageResponse":{"images":"hello"}}

有两个项目:

 {"ImageResponse":{"images":["hello","hi"]}}

有没有办法总是返回一个列表,即使列表只有一个项目?

我的响应类:

@XmlRootElement
public class ImageResponse {
private List<String> images;
//getter and setter
}
4

5 回答 5

5

尝试在您的 cxf json 提供程序上将 'serializeAsArray' 设置为 true。参考:http ://cxf.apache.org/docs/jax-rs-data-bindings.html

于 2013-09-20T15:49:17.093 回答
1

当您使用 Jettison 进行 JSON 序列化时,就会出现上述问题。Jettison 是 CXF 中的默认设置。实现您的要求的最简单方法是将 JSON Provider 更改为 Jackson。在那里,您不必设置serializeAsArray,并用列表提及arrayKeys每个字段!

将以下内容添加到您的 bean 定义中:

<jaxrs:providers>
    <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
</jaxrs:providers>

然后,添加包含 Jackson 库。maven pom依赖如下:

<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-jaxrs</artifactId>
  <version>1.9.0</version>
</dependency>

有关更多信息,请参见此处:http: //cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-Jackson

于 2014-11-05T15:08:05.930 回答
1

添加以下依赖项。

   <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-jaxrs</artifactId>
    <version>1.9.0</version>
    </dependency>

在您的代码本身中使用以下将对象转换为 json 字符串。

ObjectMapper mapperObj = new ObjectMapper();
String jsonStr = "";
try {
        // get the object as a json string
jsonStr = mapperObj.writeValueAsString(imageResponse );
        //System.out.println(jsonStr);
} catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

现在使用此字符串而不是对象(使用 CXF 将此字符串对象转换为 JSON(就像您当前为对象所做的那样))

return Response.status(201).entity(jsonStr).build();
于 2017-06-20T04:55:56.390 回答
0

有类似的情况。cxf 不返回 js 端请求的数组数组,它​​额外添加了一些“item”标签。必须更改 applicationContext.xml,添加 jsonProvider 并在 jaxrs 中引用它。

<jaxrs:server id="someid" address="/">
    <jaxrs:providers>
        <ref bean="jsonProvider" />      
    </jaxrs:providers> 

<bean id="jsonProvider"  lass="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider">
          <property name="mapper" ref="jsonMapper" /> </bean>   
<bean id="jsonMapper" class="com.bofa.idp.disclosures.CustomJsonMapper" /> 

...

在 customJsonMapper 中扩展了 ObjectMpper,并且可以做调整

public CustomJsonMapper() {
       super();
       enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
       enable(SerializationFeature.WRAP_ROOT_VALUE);
       enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
       JaxbAnnotationModule jaxbModule=new JaxbAnnotationModule();
       this.registerModule(jaxbModule);
       this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
       this.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

}

可以调整单个服务以不使用 CustomeJsonMapper @JsonFormat 中定义的全局设置(无 = JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED)

于 2018-03-23T14:08:39.607 回答
-2

您的第一个 JSON 不包含包含一个项目的列表。

如果您希望图像成为数组,则必须使用方括号。

{"ImageResponse":{"images": ["hello"] }}

于 2014-01-30T20:11:24.177 回答