2014-12-25 4 views
6

Мы используем 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

ответ

0

Нет, там нет встроенных механизмов обработки исключений для обработки исключений из CommandLineRunner с - см org.springframework.boot.SpringApplication#runCommandLineRunners, будет легче просто обернуть его вокруг традиционных обработки блоков Java исключения

+0

К сожалению, завершение операторов в run() в try catch block не помогает. Спасибо за ответ в любом случае. –

+0

Можете ли вы показать, как вы используете javax.validation для проверки ваших аргументов, может быть, это может вызвать некоторые другие идеи. –

+0

А теперь я вижу вашу точку зрения. Я считаю, что это приемлемое поведение - с точки зрения Spring, если свойства запуска не проверяются, то не запускайте приложение, а показывайте точные ошибки проверки в stacktrace. Это не относится к 'CommandLineRunners', однако, это должно быть такое же поведение с/без CommandLineRunners. –

2

я столкнулся (почти) та же проблема, и (к моему большому удивлению) кажется, что самый чистый способ показать ошибку пользователю из программы командной строки Spring Boot - это фактически System.exit(1) от CommandlineRunner.run() после регистрации любого сообщения об ошибке, которое вы хотите. В любом случае контекст Spring будет полностью закрыт, но он не вызывает события сбоя при запуске контекста, поэтому вы не получите весь другой отвлекающий вывод журнала.

Возможно, вам придется отрегулировать, как вы называете валидацию, чтобы вы сами могли поймать ошибки проверки внутри run() и перевести их в журнал + System.exit().

Смежные вопросы