web-dev-qa-db-ja.com

SpringBootで遅延読み込み属性を省略するようにJacksonを構成します

純粋なJava構成のSpringBoot MVCプロジェクトで、遅延ロード属性を省略するようにJacksonを構成する方法

13
R K Punjal

私は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.
            }
        }
    }
}
5
yeye

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();
}
18
Robert Hunt

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に追加したい場合は、遠慮なくコメントしてください。

8
R K Punjal

私にとってこれを達成する最も簡単な方法は、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によって構成されたすべてのデフォルトコンバーターを失うことはありません。

2
Grzegorz B.
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper objectMapper = jsonConverter.getObjectMapper();
    objectMapper.registerModule(new Hibernate5Module());


    return jsonConverter;
}
0
tim