web-dev-qa-db-ja.com

Springアノテーションベースの構成を使用しながらMappingJacksonHttpMessageConverterを構成する方法は?

私は、純粋なxml Beanではなく注釈を介してSpring Beanを構成することに不合理であり、結果に直面しています。

RESTチャネルを使用して構成します

<mvc:annotation-driven />

ここで、MappingJacksonHttpMessageConverterを構成して、null以外の値を持つこのフィールドのみをJSONに出力するようにします。私は次を試しました:

<bean id="jsonHttpMessageConverter"
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="prefixJson" value="false" />
    <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>

Beanは作成されますが、コンバーターの別のインスタンスが作成され、チャネルで使用されます。だから私は@Configurationおよび@BeanこのStackoverflowの質問 で説明されていますが、それでもjsonシリアル化は独自の構成を使用します。

最後に、マッパーを経由して注入しようとしました

@Autowired
private MappingJacksonHttpMessageConverter jacksonConverter;

しかし、NoSuchBeanDefinitionExceptionで終わりました。だから今、私は選択肢がなくなっているので、ここで何かアイデアを求めています。フレームワークで使用されるマッパーを制御および構成する方法

30
Danubian Sailor

WebMvcConfigurer.configureMessageConverters() メソッドを使用します。

[...]を使用するようにHttpMessageConvertersを構成します。リストにメッセージコンバーターが追加されていない場合は、代わりにデフォルトのコンバーターが追加されます。

_@Configuration_の場合:

_@Configuration
class MvcConf extends WebMvcConfigurationSupport {
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(converter());
        addDefaultHttpMessageConverters(converters);
    }

    @Bean
    MappingJacksonHttpMessageConverter converter() {
        MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter()
        //do your customizations here...
        return converter;
    }
}
_

カスタムコンバーターの使用時にはデフォルトが適用されないため、addDefaultHttpMessageConverters()の呼び出しが必要です。

重要な注意WebMvcConfigurationSupportを拡張する場合は、構成するコンバーターの_@EnableWebMvc_を削除する必要があります。

59

Javaコードでのみ春mvcサーブレット構成のカスタマイズは、複数の方法で実現できます。

最も簡単な方法は、@ConfigurationWebMvcConfigurerAdapterの注釈付きクラス:

@Configuration
@EnableWebMvc
public class ApplicationSpringConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters( List<HttpMessageConverter<?>> converters ) {
        converters.add(converter());
    }

    @Bean
    MappingJackson2HttpMessageConverter converter() {
        // [...]
    }
}

これは、Tomasz Nurkiewiczの回答によって提供される例によく似ていることに注意してください。

ただし、WebMvcConfigurationSupportの代わりにWebMvcConfigurerAdapterを使用する方が、高度なカスタマイズに適しています。デフォルトのコンバーターも追加する必要がある場合は、そうでした。

Springのドキュメントを参照してください 提供された構成のカスタマイズ

26
José Andias

次の解決策は、fetch=FetchType.LAZYモジュールをJacksonコンバーターに追加します。同様の手法を使用して、削除や再作成など、あらゆる方法でコンバーターを変更できます。

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

    for (HttpMessageConverter<?> mc : converters){
         if (mc instanceof MappingJackson2HttpMessageConverter || mc instanceof MappingJackson2XmlHttpMessageConverter) {
            ((AbstractJackson2HttpMessageConverter) mc).getObjectMapper().registerModule(new Hibernate5Module());
        }
    }
    return;
 }

この場合、

  • WebMvcConfigurerAdapterには他の多くの設定が含まれているため、別の設定クラスを避けたいと思いました。
  • extendMessageConvertersを使用すると、他のすべてのメッセージコンバーターの構成を失うことなく、自動的に構成されたJacksonクラスへのアクセスが可能になります。これはconfigureMessageConvertersが行うことです。
  • registerModuleを使用すると、必要なHibernate5Module既存のコンバーターへ。
  • モジュールはJSONとXMLプロセッサの両方に追加されました
0
sdw