我遇到了一个小问题,即 Spring boot 为我提供了绝对复杂的错误消息,我的客户都无法或不会理解。
例如:
这是我的属性配置类
@Component
@ConfigurationProperties(prefix = "input")
class WorkflowRunnerProperties{
@Valid
@NotNull(message = "please provide a file containing your targets for the parameter --input.libraryTargets")
val libraryTargets:File = null
@Valid
@NotNull(message = "please provide a file containing your targets for the parameter --input.correctionTargets")
val correctionTargets:File = null
}
在启动过程中,我收到此错误消息:
错误 [主] Spring应用程序 - 应用程序启动失败org.springframework.beans.factory.BeanCreationException:创建名为"workflowRunnerProperties"的 Bean 时出错:无法将属性绑定到 WorkflowRunnerProperties (前缀 = input, ignoreInvalidFields=false, ignoreUnknownFields=true, ignoreNestedProperties=false);嵌套异常是 org.springframework.validation.BindException: org.springframework.boot.bind.RelaxedDataBinder$RelaxedBeanPropertyBindingResult: 2 errors字段"correctionTarget"上的对象"输入"中的字段错误:拒绝值 [null];codes [NotNull.input.correctionTargets,NotNull.correctionTargets,NotNull];参数 [org.springframework.context.support.DefaultMessageSourceResolvevable: codes [input.correctionTargets,correctionTargets]; 参数 []; 默认消息 [correctionTargets]];默认消息 [请提供一个包含参数目标的文件 --input.correctionTargets]字段"库目标"上的对象"输入"中的字段错误:拒绝值 [null];codes [NotNull.input.libraryTargets,NotNull.libraryTargets,NotNull];参数 [org.springframework.context.support.DefaultMessageSourceResolvevable: codes [input.libraryTargets,libraryTargets]; 参数 []; 默认消息 [libraryTargets]];默认消息 [请提供一个包含参数目标的文件 --input.libraryTargets] at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:339) at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:289) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408)...
这很好,但提供了太多的信息,以至于它违背了目的,相反,我想看到的是:
请提供一个包含参数目标的文件 --input.correctionTargets请提供一个包含参数目标的文件 --input.libraryTargets
捕获此异常并仅记录用户的实际相关信息的最简单方法是什么,而不会用所有开发人员的东西压倒他。
谢谢
到目前为止我发现的最佳方法是捕获所有相关异常并将其登录到控制台,如下所示:
object SimpleTargetRunner extends App with LazyLogging {
try {
val app = new SpringApplication(classOf[SimpleTargetRunner])
app.setWebEnvironment(false)
val context = app.run(args: _*)
}
catch {
case x: BeanCreationException =>
x.getMostSpecificCause match {
case y:BindException =>
logger.info("dear user, we need you to provide a couple of parameters. These are the errors we observed:")
y.getAllErrors.asScala.foreach{ error:ObjectError =>
logger.info(s"${error.getDefaultMessage}")
}
}
}
}
这会导致如下日志记录语句:
亲爱的用户,我们需要您提供几个参数。这些是我们观察到的错误:请提供一个包含参数目标的文件 --input.libraryTargets请提供一个包含参数目标的文件 --input.correctionTargets