純粋なJava構成のSpringBoot MVCプロジェクトで、遅延ロード属性を省略するようにJacksonを構成する方法
私はspringbootとhibernamte5.0.xを使用しています。できます!
1。pom.xml
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.8.4</version>
</dependency>
2。Webconfig
@Configuration
public class WebConfig implements WebMvcConfigurer {
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter converter : converters) {
if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
mapper.registerModule(new Hibernate5Module());
// replace Hibernate4Module() with the proper class for your hibernate version.
}
}
}
}
Spring Bootの最近のバージョンでは、これははるかに簡単です。
タイプcom.fasterxml.jackson.databind.ModuleのBeanは、自動構成されたJackson2ObjectMapperBuilderに自動的に登録され、作成されるObjectMapperインスタンスに適用されます。これにより、アプリケーションに新しい機能を追加するときにカスタムモジュールを提供するためのグローバルメカニズムが提供されます。
74.3 Jackson ObjectMapperのカスタマイズ
まず、必要なJackson依存関係があることを確認します。
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate4</artifactId>
</dependency>
次に、モジュールを@Bean
としてアプリケーションコンテキストに含めることができます。
@Bean
public Module hibernate4Module()
{
return new Hibernate4Module();
}
SpringBootを使用している場合、理想的には、すでにHibernate4Moduleが必要です。それ以外の場合は、この依存関係を追加します
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate4</artifactId>
<version>2.5.3</version>
</dependency>
次に、「HibernateAwareObjectMapper」または名前を付けたい名前のクラスを作成します。
以下の内容で:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;
public class HibernateAwareObjectMapper extends ObjectMapper {
public HibernateAwareObjectMapper() {
registerModule(new Hibernate4Module());
}
}
hibernateのさまざまなバージョンについては、次のHibernateモジュールを参照してください。
// for Hibernate 4.x:
mapper.registerModule(new Hibernate4Module());
// or, for Hibernate 5.x
mapper.registerModule(new Hibernate5Module());
// or, for Hibernate 3.6
mapper.registerModule(new Hibernate3Module());
次に、メッセージコンバータを介してHibernateAwareObjectMapperを登録する必要があります。このために、WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapterを拡張するConfigクラスを作成します。 (すでにお持ちの場合は、次の手順に従ってください)。
次に、HibernateObjectMapperを使用してMessageConverterを登録します。
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
List<MediaType> supportedMediaTypes=new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
MappingJackson2HttpMessageConverter converter=new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(new HibernateAwareObjectMapper());
converter.setPrettyPrint(true);
converter.setSupportedMediaTypes(supportedMediaTypes);
converters.add(converter);
super.configureMessageConverters(converters);
}
ヴィオラ!!!それで十分なはずです。これは、Spring Boot Webアプリでこれを行う純粋なJava(no-xml)の方法です。
Answerに追加したい場合は、遠慮なくコメントしてください。
私にとってこれを達成する最も簡単な方法は、WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter
を拡張してextendMessageConverters
メソッドをオーバーライドすることでした。内部でMappingJackson2HttpMessageConverter
を検索し、JacksonHibernateモジュールを登録しました。
@Configuration
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class CustomWebMvcAutoConfig extends WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter
{
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter converter : converters) {
if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
mapper.registerModule(new Hibernate4Module());
// replace Hibernate4Module() with the proper class for your hibernate version.
}
}
}
}
このようにして、Springによって構成されたすべてのデフォルトコンバーターを失うことはありません。
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = jsonConverter.getObjectMapper();
objectMapper.registerModule(new Hibernate5Module());
return jsonConverter;
}