私は、純粋な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
で終わりました。だから今、私は選択肢がなくなっているので、ここで何かアイデアを求めています。フレームワークで使用されるマッパーを制御および構成する方法
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
_を削除する必要があります。
Javaコードでのみ春mvcサーブレット構成のカスタマイズは、複数の方法で実現できます。
最も簡単な方法は、@Configuration
WebMvcConfigurerAdapter
の注釈付きクラス:
@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のドキュメントを参照してください 提供された構成のカスタマイズ
次の解決策は、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
既存のコンバーターへ。