2011-07-09 16 views
3

次のSpring DI XMLを改善できますか? xmlの下には、ターゲットBeanを設定するプログラム的なアプローチがあります。Beanを設定するより良い方法はありますか?

<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" /> 
<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig" 
    factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" /> 
<bean 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="jacksonSerializationConfig" /> 
    <property name="targetMethod" value="setSerializationInclusion" /> 
    <property name="arguments"> 
     <list> 
      <value type="org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion">NON_NULL</value> 
     </list> 
    </property> 
</bean> 

ObjectMapperマッパー=新しい ObjectMapper()。 012Service();}

+1

XMLベースの宣言型DIは誰が良いことだと言いましたか? –

+0

あなたが設定しているシングルトンが適切に設計されている場合は素晴らしいことです。 – HDave

答えて

3

XMLはこれを行うには本当に悪い方法です。はい、あなたはは、これを行うことができますが、それはあなたのObjectMapperを設定FactoryBeanを書くためにはるかに簡単です:

あなたのXMLで
public class MyObjectMapperFactoryBean extends AbstractFactoryBean<ObjectMapper> { 
    public Class<ObjectMapper> getObjectType() { 
     return ObjectMapper.class; 
    } 

    public ObjectMapper createInstance() { 
     // create and return ObjectMapper 
    } 
} 

、その後:

<bean id="jacksonObjectMapper" class="x.y.MyObjectMapperFactoryBean" /> 
1

それでも完全に理想的な、少しではありませんクリーナー:

<bean id="objectMapperBuilder1" class="org.codehaus.jackson.map.ObjectMapper"/> 
<bean id="objectMapperBuilder2" factory-bean="objectMapperBuilder1" factory-method="setSerializationInclusion"> 
    <constructor-arg value="NON_NULL"/> 
</bean> 
<bean id="jsonWriter" factory-bean="objectMapperBuilder2" factory-method="writerWithDefaultPrettyPrinter" /> 
<!-- etc, etc --> 

1つの欠点は、メモリ内に不要なBeanインスタンスがあることです。 (私はこのメソッドを使用しており、Springがこれらを処理することを決定するまで、私はこのメソッドを使用しています)。ここには多くのスレッドがあり、Springフォーラムでは、ジャクソンが使用しているビルダーパターンのような流暢なセッターのサポートを求めていますが、それまではあなたのために悪いものを選ぶ必要があります。

1

私は、避けられないほど畳み込まれたSpring XML Bean設定の代わりにFactoryBeanを使用してJackson ObjectMapperを設定するという一般的なアプローチに同意します。 Spring 3.2以降では、このようなFactoryBeanをそのまま使用できます。 JacksonObjectMapperFactoryBean/Jackson2ObjectMapperFactoryBeanを参照してください。ここでは春FactoryBeanの経由ObjectMapperを設定するには、春のXMLの例だ -

<bean id="jacksonObjectMapper" factory-bean="&amp;jacksonObjectMapperFactoryBean" factory-method="getObject"/> 
<bean id="jacksonObjectMapperFactoryBean" class="org.springframework.http.converter.json.JacksonObjectMapperFactoryBean"> 
    <property name="featuresToDisable"> 
    <array> 
     <util:constant static-field="org.codehaus.jackson.map.SerializationConfig$Feature.WRITE_NULL_PROPERTIES"/> 
    </array> 
    </property> 
</bean> 

(FactoryBeanの上のファクトリメソッドを使用するように春を指示する「工場出荷時にBeanの属性に&アンプを使用する必要性を注意してくださいそれ自身が作成するBeanではなく)。

+0

Spring 3.2.8でそれ以外はうまく動作します。java.lang.ClassNotFoundException:com.fasterxml.jackson.databind'を取得します。 'Jackson2ObjectMapperFactoryBean'のJavadocとは異なり、列挙型の値は' $ ':ではなく' .'で区切られています: 'SerializationFeature.WRAP_ROOT_VALUE'。 –

関連する問題