![](/img/trans.png)
[英]Spring boot CommandLineRunner exception handling recommendation
[英]Spring boot CommandLineRunner Exception Handling
我们正在将Spring-boot用于命令行应用程序。 我们使用javax.validation来验证命令行参数。
现在,如果遇到验证错误,我们如何打印友好的错误消息? 我们不想显示堆栈跟踪。
在将Spring-boot作为CommandLineRunner运行时,是否可以使用ExceptionHandler机制?
谢谢阿伦
资源
@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);
}
}
干净运行
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
验证检查
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上找到
我遇到了(几乎)相同的问题,并且(令我惊讶的是)从Spring Boot命令行程序向用户显示错误的最干净的方法似乎是从CommandlineRunner.run()
实际上是System.exit(1)
CommandlineRunner.run()
记录所需的任何错误消息后, CommandlineRunner.run()
。 无论如何,Spring上下文都会干净地关闭,但是它不会触发上下文启动失败事件,因此您不会得到所有其他分散注意力的日志输出。
您可能需要调整调用验证的方式,以便自己可以在run()
捕获验证错误,并将其转换为log + System.exit()
。
不,没有内置的异常处理机制可用于处理CommandLineRunner
的异常-请参见org.springframework.boot.SpringApplication#runCommandLineRunners
,将其包装在传统的Java异常处理块周围会更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.