在Spring Boot CommandLineRunner应用程序中键入转换

时间:2016-06-08 11:12:35

标签: java spring spring-boot

我很高兴使用@Value将命令行参数注入基于Spring Boot CommandLineRunner的程序。即。

 java -jar myJar.jar --someParm=foo

...适用于包含以下内容的类

 @Autowired
 public MyBean(@Value("someParm") String someParm) { ... }

但是,当parm不是String时,我现在看到这个失败。

这是我的豆子:

@Component
class MyBean {

    private final LocalDate date;

    @Autowired
    public MyBean (@Value("date") @DateTimeFormat(iso=ISO.DATE) LocalDate date) {
        this.date = date;
    }

    public void hello() {
        System.out.println("Hello on " + date);
    }

}

...和我的申请类:

@SpringBootApplication
public class MyApp implements CommandLineRunner {

    @Autowired
    private MyBean myBean;

    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }

    @Override
    public void run(String... args) throws IOException {
        myBean.hello();
    }
}

当我以java -jar MyApp.java --date=2016-12-10运行它时,我得到一个堆栈跟踪结束:

 java.lang.IllegalStateException: Cannot convert value of type
 [java.lang.String] to required type [java.time.LocalDate]: 
 no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:302)

虽然文档说明了String-> Date的标准转换器,但我已尝试注册我自己的,并且点击与此帖子相同的NullPointerException:How to register custom converters in spring boot?

我可以做些什么来完成这项工作?

Java 8,Spring Boot 1.3.5-RELEASE

2 个答案:

答案 0 :(得分:0)

您是否尝试使用java.util.Date代替java.time.LocalDate?我怀疑转换会自动生效。

答案 1 :(得分:0)

通常(当使用@EnableWebMvc或类似的东西时)Spring自动注册转换服务,但是有些情况(例如命令行应用程序),你应该手动注册它:

@Bean
public static ConversionService conversionService() {
    return new DefaultFormattingConversionService();
}