JSON応答を返すSpring Webサービスがあります。ここに示す例を使用してサービスを作成しています: http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/
json が返される形式は次のとおりです: {"name":null,"staffName":["kfc-kampar","smith"]}
返された応答から null オブジェクトを削除したいので、次のようになります: {"staffName":["kfc-kampar","smith"]}
ここで同様の質問がされているのを見つけましたが、解決策を得ることができました。
spring アノテーションベースの構成を使用しているときに MappingJacksonHttpMessageConverter を構成する方法は?
spring mvc 3でjacksonObjectMapperが機能しない構成
json応答で「null」オブジェクトを返さないようにspring mvc 3を構成する方法は?
Spring は @ResponseBody JSON 形式を構成します
Jackson+Spring3.0.5 カスタム オブジェクト マッパー
これらのソースやその他のソースを読んだ結果、私が望んでいたことを達成するための最もクリーンな方法は、Spring 3.1 と mvc-annotation 内で構成できるメッセージ コンバーターを使用することであることがわかりました。私の更新された春の設定ファイルは次のとおりです。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<context:component-scan base-package="com.mkyong.common.controller" />
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="prefixJson" value="true" />
<property name="supportedMediaTypes" value="application/json" />
<property name="objectMapper">
<bean class="org.codehaus.jackson.map.ObjectMapper">
<property name="serializationInclusion" value="NON_NULL"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
サービス クラスは、mkyong.com サイトで指定されているものと同じですが、Shop name 変数の設定をコメント アウトして null にしています。つまり、
@Controller
@RequestMapping("/kfc/brands")
public class JSONController {
@RequestMapping(value="{name}", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody Shop getShopInJSON(@PathVariable String name) {
Shop shop = new Shop();
//shop.setName(name);
shop.setStaffName(new String[]{name, "cronin"});
return shop;
}
}
私が使用している Jackson jar は、jackson-mapper-asl 1.9.0 と jackson-core-asl 1.9.0 です。これらは、mkyong.com からダウンロードした spring-json プロジェクトの一部として提供されている、pom に追加した唯一の新しい jar です。
プロジェクトは正常にビルドされますが、ブラウザからサービスを呼び出すと、{"name":null,"staffName":["kfc-kampar","smith"]} という同じ結果が返されます
設定のどこが間違っているのか誰か教えてもらえますか?
他にもいくつかのオプションを試しましたが、JSON を正しい形式で返すことができた唯一の方法は、オブジェクト マッパーを JSONController に追加し、"getShopInJSON" メソッドで文字列を返すようにすることです。
public @ResponseBody String getShopInJSON(@PathVariable String name) throws JsonGenerationException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
Shop shop = new Shop();
//shop.setName(name);
shop.setStaffName(new String[]{name, "cronin"});
String test = mapper.writeValueAsString(shop);
return test;
}
ここでサービスを呼び出すと、予想される {"staffName":["kfc-kampar","cronin"]} が得られます
@JsonIgnore アノテーションを使用して動作させることもできましたが、このソリューションは私には適していません。
コードでは機能するのに構成では機能しない理由がわかりません。