스프링 부트에 사용자 지정 변환기를 등록하는 방법은 무엇입니까?
저는 spring-boot-starter-jdbc(v1.3.0)를 사용하여 애플리케이션을 작성합니다.
만난 : 를 들면: 예를 들면: 예를 들면: 예를 : 예를 들면,BeanPropertyRowMapper
할 수 에 실패합니다.java.sql.Timestamp
java.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 서버에서는 작동하지 않습니다.)
이 기능이 작동하려면 다음과 같이 하십시오.@WebMvcTest
s, 또한 이 구성 클래스와 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
'programing' 카테고리의 다른 글
부트스트랩 모달 닫기 (0) | 2023.07.11 |
---|---|
Firestore null이 아닌 곳을 선택합니다. (0) | 2023.07.11 |
git 모든 변경 사항을 취소하고 업스트림에서 끌어옵니다. (0) | 2023.07.06 |
C에서 문자열을 2개의 문자열로 분할하는 방법 (0) | 2023.07.06 |
새 시간 초과 속성이 통과할 때 카운트다운 타이머가 표시되지 않습니다.어떻게 고칠까요? (0) | 2023.07.06 |