title: Spring boot CommandLineRunner Exception Handling
body: <p>We are using Spring-boot for a commandline application. We are using javax.validation for validating command-line arguments. </p>
  
  <p>Now, if we have a validation error how can we print friendly error message? We don't want to show Stack trace.</p>
  
  <p>Is there a ExceptionHandler mechanism we could use when we are running Spring-boot as CommandLineRunner?</p>
  
  <p>Thanks
  Arun</p>
  
  <p><strong>Source</strong></p>
  
  <pre><code>    @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...");
      }
  }
  </code></pre>
  
  <p><strong>Configuration</strong></p>
  
  <pre><code>@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);
      }
  }
  </code></pre>
  
  <p><strong>Clean Run</strong></p>
  
  <pre><code>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
  </code></pre>
  
  <p><strong>Validation Check</strong></p>
  
  <pre><code>java -jar target/spring-boot-example-1.0.0-SNAPSHOT.jar --spring.profiles.active=preprod,qa
  </code></pre>
  
  <p><strong>Validation Error</strong></p>
  
  <pre><code>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]
  </code></pre>
  
  <p><strong>Complete Source</strong> </p>
  
  <p>Source can be found in <a href="https://github.com/arun-avanathan/spring-boot-example">GitHub</a></p>