Мы используем Spring-boot для приложения с командной строкой. Мы используем javax.validation для проверки аргументов командной строки.Весенняя загрузка CommandLineRunner Обработка исключений
Теперь, если у нас есть ошибка проверки, как мы можем печатать дружественное сообщение об ошибке? Мы не хотим показывать трассировку стека.
Есть ли механизм ExceptionHandler, который мы могли бы использовать, когда мы запускаем Spring-boot в качестве CommandLineRunner?
Благодаря Arun
Источник
@SpringBootApplication
public class Deploy implements CommandLineRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(Deploy.class);
@Autowired
private DeployConfig config;
@Autowired
private DeployService deployService;
/**
* mvn clean package spring-boot:repackage
* java -jar target/spring-boot-example-1.0.0-SNAPSHOT.jar --spring.profiles.active=qa --version=1.0
*
* @param strings arguments
* @throws Exception
*/
@Override
public void run(String... strings) throws Exception {
try {
deployService.deploy(config);
} catch (Exception ve) {
LOGGER.error("Error : {}", ve.getMessage());
}
LOGGER.info("Created stack={}", config.getVersion());
}
public static void main(String... args) {
LOGGER.info("Starting to run...");
SpringApplication.run(Deploy.class, args);
LOGGER.info("Completed the run...");
}
}
Конфигурация
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
public class DeployConfig {
@NotNull
private String hello;
@NotNull
private String version;
private String envKey;
public String getHello() {
return hello;
}
public void setHello(String hello) {
this.hello = hello;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getEnvKey() {
return envKey;
}
public void setEnvKey(String envKey) {
this.envKey = envKey;
}
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
Clean Run
mvn clean package spring-boot:repackage
java -jar target/spring-boot-example-1.0.0-SNAPSHOT.jar --spring.profiles.active=preprod,qa --version=1.0
Validation Check
java -jar target/spring-boot-example-1.0.0-SNAPSHOT.jar --spring.profiles.active=preprod,qa
Ошибка проверки
2014-12-25 20:51:13,325 ERROR [main] [o.s.b.SpringApplication.run()] - Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deploy': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.DeployConfig com.example.Deploy.config; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deployConfig': Could not bind properties; nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'target' on field 'version': rejected value [null]; codes [NotNull.target.version,NotNull.version,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.version,version]; arguments []; default message [version]]; default message [may not be null]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.1.3.RELEASE.jar!/:4.1.3.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) ~[spring-beans-4.1.3.RELEASE.jar!/:4.1.3.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-4.1.3.RELEASE.jar!/:4.1.3.RELEASE]
Полный исходный
Источник может быть найден в GitHub
К сожалению, завершение операторов в run() в try catch block не помогает. Спасибо за ответ в любом случае. –
Можете ли вы показать, как вы используете javax.validation для проверки ваших аргументов, может быть, это может вызвать некоторые другие идеи. –
А теперь я вижу вашу точку зрения. Я считаю, что это приемлемое поведение - с точки зрения Spring, если свойства запуска не проверяются, то не запускайте приложение, а показывайте точные ошибки проверки в stacktrace. Это не относится к 'CommandLineRunners', однако, это должно быть такое же поведение с/без CommandLineRunners. –