Есть ли лучший способ настроить бин? - PullRequest
3 голосов
/ 09 июля 2011

Можно ли улучшить следующий Spring DI xml? Ниже xml представлен программный подход к настройке целевого компонента.

<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 mapper = new ObjectMapper (); mapper.getSerializationConfig () setSerializationInclusion (JsonSerialize.Inclusion.NON_NULL).

Ответы [ 3 ]

3 голосов
/ 10 июля 2011

XML - действительно плохой способ сделать это.Да, вы можете сделать это, но гораздо проще написать FactoryBean, который настраивает ваш ObjectMapper:

public class MyObjectMapperFactoryBean extends AbstractFactoryBean<ObjectMapper> {
   public Class<ObjectMapper> getObjectType() {
      return ObjectMapper.class;
   }

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

, а затем в XML:

<bean id="jacksonObjectMapper" class="x.y.MyObjectMapperFactoryBean" />
1 голос
/ 22 октября 2013

Я согласен с общим подходом @ skaffman по использованию FactoryBean вместо неизбежно замысловатой конфигурации бина Spring XML для настройки Jackson ObjectMapper. Spring 3.2+ теперь предоставляет такой FactoryBean из коробки. См. JacksonObjectMapperFactoryBean / Jackson2ObjectMapperFactoryBean . Вот пример Spring XML для настройки ObjectMapper через Spring FactoryBean -

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

(обратите внимание на необходимость использовать & amp в атрибуте «factory-bean», чтобы инструктировать Spring для использования метода factory на самом FactoryBean, а не на создаваемом ею компоненте).

1 голос
/ 06 сентября 2012

Все еще не совсем идеально, но немного чище:

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

Одним недостатком является то, что у вас в памяти будут ненужные экземпляры бинов. (Я использую этот метод, и я буду жить с ним, пока Spring не решит с ними справиться). Здесь и на форумах Spring много тем, в которых просят о поддержке таких беглых сеттеров, как шаблон строителя, используемый Джексоном, но до тех пор вы должны выбирать меньшее зло для себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...