我使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何让我提供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();
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有一个启动应用程序,并在我的一个外观我尝试Autowire conversionService这样:
@Autowired
private ConversionService conversionService;
Run Code Online (Sandbox Code Playgroud)
结果我得到了这个:
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.core.convert.ConversionService] is defined: expected single matching bean but found 3: mvcConversionService,defaultConversionService,integrationConversionService
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1061)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 16 more
Run Code Online (Sandbox Code Playgroud)
为了克服这个问题,我添加了一个限定符lilke:
@Autowired
@Qualifier("mvcConversionService")
private ConversionService c;
Run Code Online (Sandbox Code Playgroud)
这一切都有效.但是我的所有自定义转换器都会自动添加到mvcConversionService.现在我想扩展ConversionService并添加另一种方法,但我的转换器再次添加到mvcConversionService.有没有办法告诉spring-boot conversionService使用哪些来自动注册我的转换器?我不想手动将所有转换器列入新的转换器conversionService.
我有这样的xml:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="converters.AddressToStringConverter" />
<bean class="converters.StringToAddressConverter" />
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
它可以毫无问题地配置转换器.
但是这段代码无法做到:
@Configuration
public class ConversionConfiguration {
@Bean
public ConversionService getConversionService() {
ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
bean.setConverters(getConverters());
bean.afterPropertiesSet();
ConversionService object = bean.getObject();
return object;
}
private Set<Converter> getConverters() {
Set<Converter> converters = new HashSet<Converter>();
converters.add(new AddressToStringConverter());
converters.add(new StringToAddressConverter());
return converters;
}
}
Run Code Online (Sandbox Code Playgroud)
这个配置由上下文扫描 - 我用调试器检查它.哪里可能是问题?
我有一个包含另一个实体的实体,如下所示:
public class Order {
@Id
private int id;
@NotNull
private Date requestDate;
@NotNull
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="order_type_id")
private OrderType orderType;
}
public class OrderType {
@Id
private int id;
@NotNull
private String name;
}
Run Code Online (Sandbox Code Playgroud)
我有一个Spring MVC表单,用户可以在其中提交新订单; 他们必须填写的字段是请求日期并选择订单类型(这是一个下拉列表).
我正在使用Spring Validation来验证在尝试将orderType.id转换为OrderType时失败的表单输入.
我编写了一个自定义转换器来将orderType.id转换为OrderType对象:
public class OrderTypeConverter implements Converter<String, OrderType> {
@Autowired
OrderTypeService orderTypeService;
public OrderType convert(String orderTypeId) {
return orderTypeService.getOrderType(orderTypeId);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我不知道如何使用java配置使用Spring注册此转换器.我发现的XML等价物(来自Spring MVC中的Dropdown值绑定)是:
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="OrderTypeConverter"/>
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
从搜索网络我似乎找不到相当于java配置 - 有人可以帮助我吗?
UPDATE
我已将OrderTypeConvertor添加到WebMvcConfigurerAdapter,如下所示: …