spring boot cli decent error message

时间:2016-07-13 21:40:52

标签: java spring scala

我遇到了一个轻微的问题,即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
}

在启动过程中,我收到以下错误消息:

错误[main] SpringApplication - 应用程序启动失败 org.springframework.beans.factory.BeanCreationException:创建名为'workflowRunnerProperties'的bean时出错:无法将属性绑定到WorkflowRunnerProperties(prefix = input,ignoreInvalidFields = false,ignoreUnknownFields = true,ignoreNestedProperties = false);嵌套异常是org.springframework.validation.BindException:org.springframework.boot.bind.RelaxedDataBinder $ RelaxedBeanPropertyBindingResult:2个错误 字段'correctionTargets'上对象'input'中的字段错误:被拒绝的值[null];代码[NotNull.input.correctionTargets,NotNull.correctionTargets,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable:codes [input.correctionTargets,correctionTargets];参数[];默认消息[correctionTargets]];默认消息[请提供包含参数目标的文件--input.correctionTargets] 字段'libraryTargets'上对象'input'中的字段错误:被拒绝的值[null];代码[NotNull.input.libraryTargets,NotNull.libraryTargets,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable:codes [input.libraryTargets,libraryTargets];参数[];默认消息[libraryTargets]];默认消息[请提供包含参数目标的文件--input.libraryTargets]     at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:339)     在org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:289)     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408) ...

这很好,但提供了很多信息,以至于它失败了,而我想看到的只是:

请提供一个包含参数--input.correctionTargets目标的文件 请提供一个文件,其中包含参数--input.libraryTargets

的目标

捕获此异常的最简单方法是什么,只记录用户的实际相关信息,而不会让所有开发人员的东西压倒他。

感谢

1 个答案:

答案 0 :(得分:0)

到目前为止我找到的最好的方法是捕获所有相关的异常并将其记录到控制台,如下所示:

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

目标的文件