programing

Jackson이 Spring Boot에서 레이지 로드 특성을 생략하도록 구성

padding 2023. 7. 22. 09:30
반응형

Jackson이 Spring Boot에서 레이지 로드 특성을 생략하도록 구성

순수 Java 구성으로 봄에 부팅하는 mvc 프로젝트 레이지 로드 속성을 생략하도록 Jackson을 구성하는 방법

최근 버전의 Spring Boot를 사용하면 훨씬 쉬워집니다.

com.fasterxml.jackson.databind 유형의 빈입니다.모듈은 자동으로 구성된 Jackson2ObjectMapperBuilder에 자동으로 등록되고 모듈이 생성하는 ObjectMapper 인스턴스에 적용됩니다.이는 응용프로그램에 새 기능을 추가할 때 사용자 지정 모듈을 제공하는 글로벌 메커니즘을 제공합니다.

74.3 Jackson Object Mapper 사용자 정의

먼저 필요한 Jackson 종속성이 있는지 확인합니다.

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate4</artifactId>
</dependency>

그런 다음 모듈을 다음과 같이 포함할 수 있습니다.@Bean응용 프로그램 컨텍스트에서.

@Bean
public Module hibernate4Module()
{
    return new Hibernate4Module();
}

나는 springboot와 hibernamt 5.0.x를 사용합니다.효과가 있습니다!

pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.8.4</version>
</dependency>

웹 구성

@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.
            }
        }
    }
}

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

다양한 버전의 최대 절전 모드는 다음 최대 절전 모드 모듈을 참조하십시오.

// 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());

이제 Converter 메시지를 통해 HibernateAwareObjectMapper를 등록해야 합니다.이를 위해 WebMvcAutoConfiguration을 확장하는 Config 클래스를 만듭니다.WebMvcAutoConfigurationAdapter. (이미 다음 단계를 수행하십시오.)

이제 HibernateObjectMapper를 사용하여 메시지 변환기를 등록합니다.

@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);
}

비올라!!!그만하면 충분할 거야. .이것이 스프링 부트 웹 앱에 대한 순수 자바(no-xml) 방식입니다.

답변에 추가하려면 언제든지 의견을 제시하십시오.

이를 달성하기 위한 가장 쉬운 방법은 확장하는 것이었습니다.WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter및 오버라이드extendMessageConverters방법.내가 찾아본 안에는MappingJackson2HttpMessageConverter방금 잭슨 하이버네이트 모듈을 등록했습니다.

@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.
            }
        }
    }
}

이렇게 하면 스프링에 의해 구성된 모든 기본 변환기가 손실되지 않습니다.

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


    return jsonConverter;
}

@Grzegorz가 쓴 것은 저에게 완벽합니다.사용자 지정 클래스 없이 솔루션을 여기에 제시하면 다음과 같습니다.

편집: RestController 도메인에 있습니다.

@Configuration
public class CustomWebMvcAutoConfig extends WebMvcConfigurerAdapter
{
    @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 Hibernate5Module());
                // replace Hibernate4Module() with the proper class for your hibernate version.
            }
        }
    }
}

언급URL : https://stackoverflow.com/questions/33727017/configure-jackson-to-omit-lazy-loading-attributes-in-spring-boot

반응형