programing

스프링 부트에 사용자 지정 변환기를 등록하는 방법은 무엇입니까?

telebox 2023. 7. 6. 22:09
반응형

스프링 부트에 사용자 지정 변환기를 등록하는 방법은 무엇입니까?

저는 spring-boot-starter-jdbc(v1.3.0)를 사용하여 애플리케이션을 작성합니다.

만난 : 를 들면: 예를 들면: 예를 들면: 예를 : 예를 들면,BeanPropertyRowMapper할 수 에 실패합니다.java.sql.Timestampjava.time.LocalDateTime.

문제를 저는 이문를복기위해, 구습다니했현저사는을 했습니다.org.springframework.core.convert.converter.Converter이러한 유형의 경우.

public class TimeStampToLocalDateTimeConverter implements Converter<Timestamp, LocalDateTime> {

    @Override
    public LocalDateTime convert(Timestamp s) {
        return s.toLocalDateTime();
    }
}

다음과 같습니다: 어떻게 가능하게 ?TimeStampToLocalDateTimeConverter위해서BeanPropertyRowMapper.

더 일반적인 질문은 컨버터를 시스템 전체에서 사용할 수 있도록 하려면 어떻게 등록해야 합니까?

다음 코드는 다음과 같습니다.NullPointerException초기화 단계:

private Set<Converter> getConverters() {
    Set<Converter> converters = new HashSet<Converter>();
    converters.add(new TimeStampToLocalDateTimeConverter());
    converters.add(new LocalDateTimeToTimestampConverter());

    return converters;
}

@Bean(name="conversionService")
public ConversionService getConversionService() {
    ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
    bean.setConverters(getConverters()); 
    bean.afterPropertiesSet();
    return bean.getObject();
}    

감사해요.

모든 사용자 지정 변환 서비스는 Formatter Registry에 등록해야 합니다.WebMvcConfigurer를 구현하여 새 구성을 만들고 변환 서비스를 등록합니다.

@Configuration
public class WebConfig implements WebMvcConfigurer {
 
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new TimeStampToLocalDateTimeConverter());
    }
}

이게 먹히길 바랍니다.

가지 질문이 비슷하다고 생각하기 때문에 https://stackoverflow.com/a/72781591/140707 에서 답변을 복사하겠습니다(답변은 두 가지 모두에 적용됩니다).


기존 답변은 효과가 없었습니다.

  • 사자정방을 통해 정의WebMvcConfigurerAdapter.addFormatters 단순히 에 (으)로 을 달기만 하면 됩니다.)@Component) WebMVC 컨텍스트에서만 작동하며 다음을 포함한 모든 에서 사용자 지정 변환기를 사용할 수 있습니다.@Value어떤 콩이든 주사
  • ConversionService(을콩통해을)통해)ConversionServiceFactoryBean @Bean또는@Component Boot이 기본 Spring Boot으로 됩니다.ApplicationConversionService에서.SpringApplication당신이 정의한 사용자 정의 콩이 있는 공장이며, 이는 아마도 기반이 될 것입니다.DefaultConversionService단위:)()AbstractApplicationContext.finishBeanFactoryInitialization) 에 문제는스링프부다음같과트은유변추것용입다니는가환과 편리한 것입니다StringToDurationConverter ▁in에 정해진 DefaultConversionService그래서 그것을 교체함으로써 당신은 그 변환들을 잃게 됩니다.사용하지 않으면 문제가 되지 않을 수도 있지만, 이는 솔루션이 모든 사용자에게 효과가 있는 것은 아니라는 것을 의미합니다.

과 같은 다을만습다니를 .@Configuration나에게 도움이 된 수업.으로 사용자 를 기적으 변환기에 합니다.ConversionService에서 사용하는 인스턴스Environment(그 후 이 정보는 다음으로 전달됩니다.BeanFactory이렇게 하면 사용 중인 변환 서비스에 사용자 지정 변환기를 추가하는 동시에 가능한 한 많은 이전 버전과의 호환성을 유지할 수 있습니다.

@Configuration
public class ConversionServiceConfiguration {

    @Autowired
    private ConfigurableEnvironment environment;

    @PostConstruct
    public void addCustomConverters() {
        ConfigurableConversionService conversionService = environment.getConversionService();
        conversionService.addConverter(new MyCustomConverter());
    }
}

프로세스를 보다 자동화하려면 사용자 지정 변환기 목록을 이 구성 클래스에 자동으로 연결하고 위에서 하드 코딩한 방법 대신 이 변환기를 변환 서비스에 추가하도록 루프할 수 있습니다.

해야 할 수 되기 전에 이 다음과 같이 .ConversionService스프링 응용 프로그램의 주요 소스로 추가합니다.run()호출:

@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(new Class<?>[] { MySpringBootApplication.class, ConversionServiceConfiguration.class }, args);
    }
}

이렇게 하지 않으면 클래스가 검색되는 순서를 결정하는 Spring Boot JAR에서 끝나는 순서에 따라 작동하거나 작동하지 않을 수 있습니다. (이것은 Oracle JDK를 사용하여 로컬로 컴파일할 때 작동하지만 Azul Zulu JDK를 사용하는 CI 서버에서는 작동하지 않습니다.)

이 기능이 작동하려면 다음과 같이 하십시오.@WebMvcTests, 또한 이 구성 클래스와 Spring Boot 애플리케이션 클래스를 결합하여@ContextConfiguration:

@WebMvcTest(controllers = MyController.class)
@ContextConfiguration(classes = { MySpringBootApplication.class, ConversionServiceConfiguration.class })
@TestPropertySource(properties = { /* ... properties to inject into beans, possibly using your custom converter ... */ })
class MyControllerTest {
   // ...
}

애플리케이션 전체에서 단일 ConversionService 인스턴스를 사용하려면 @Autowired 및 관련 종속성 주입 메커니즘을 사용하는 것이 좋습니다.구성 내에서 변환 서비스가 인스턴스화됩니다.

애플리케이션 전체에서 사용할 수 있는 모든 변환기는 주석(예: @AutoRegistered)을 수신합니다.응용 프로그램을 시작할 때 @Component Formatter Registrar(유형 이름 자체가 약간 오해의 소지가 있습니다. 예, "...등록을 할 때 "등록자".그리고 @Component는 완전히 관리되고 종속성 주입이 필요하므로) 주석이 달린 모든 변환기의 @AutoRegistered List를 수신합니다.

구체적인 구현에 대한 자세한 내용은 이 스레드를 참조하십시오.우리는 이 메커니즘을 우리의 프로젝트 내에서 사용하고 그것은 매력적으로 작동합니다.

org.springframework.web.servlet.config.annotation.WebMvcConfigurer또는 스프링 부트 프로젝트에서 모든 종류의 사용자 지정을 위한 단일 지점입니다.Converter 요구 사항에 맞는 다양한 방법을 제공합니다.

확장을 통해 새 Converter를 수행org.springframework.core.convert.converter.Converter<S, T>그런 다음 클래스 오버라이드 방법으로 스프링에 등록합니다.org.springframework.web.servlet.config.annotation.WebMvcConfigurer.addFormatters(FormatterRegistry)

기본적으로 조건부 변환기에서 시작하는 다른 유형의 변환기도 있습니다.

추가하는 중

@Converter(autoApply = true)

변환기 클래스 위에 배치해야 합니다.이것은 DB와의 상호작용을 위해 로컬 날짜에 Converter가 필요한 경우에 저에게 도움이 됩니다.

@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate locDate) {
      return (locDate == null ? null : Date.valueOf(locDate));
    }

    @Override
    public LocalDate convertToEntityAttribute(Date sqlDate) {
      return (sqlDate == null ? null : sqlDate.toLocalDate());
    }
}

이제 DB와 상호 작용하는 동안 자동으로 적용됩니다.

언급URL : https://stackoverflow.com/questions/34239585/how-to-register-custom-converters-in-spring-boot

반응형