【问题标题】:JSR-303 validation in Spring controller and getting @JsonProperty nameSpring 控制器中的 JSR-303 验证并获取 @JsonProperty 名称
【发布时间】:2017-06-02 17:45:24
【问题描述】:

我在我的 Spring 应用程序中使用 JSR-303 进行验证,它可以根据需要工作。

这是一个例子:

@Column(nullable = false, name = "name")
    @JsonProperty("customer_name")
    @NotEmpty
    @Size(min = 3, max = 32)
    private String name;

并且 REST API 客户端使用 customer_name 作为输入字段的名称发送到 API 芽验证字段错误 org.springframework.validation.FieldError 返回 name 作为字段的名称。

有什么方法可以获取在@JsonProperty 中指定的JSON-ish 名称吗?还是我必须实现自己的映射器将类字段名称映射到其 JSON 替代项?

Edit1:将类字段重命名为与 JSON 名称对应的名称是不可替代的(出于多种原因)。

【问题讨论】:

  • 这个answer 可能会给您一些关于如何解析约束违规然后使用Jackson 查找实际JSON 属性名称的见解。

标签: java validation mapping bean-validation


【解决方案1】:

现在可以使用PropertyNodeNameProvider 来完成。

【讨论】:

  • 从我最初的实验来看,这适用于自定义 bean 验证 ConstraintValidation 属性名称,但是当 Spring 将其转换为 FieldError 时失败,因为它需要实际的字段名称而不是 JSON 属性名字。
  • @M.Justin 这是真的。我为此开了一个问题:github.com/spring-projects/spring-framework/issues/24811,但还没有回复。解决方法是扩展org.springframework.validation.beanvalidation.LocalValidatorFactoryBean,并覆盖getRejectedValue 以返回空字符串。仅当您稍后(在某些 @ControllerAdvice 中)创建自己的错误表示,而不依赖于 Spring 提供的错误表示时,这才有效。
【解决方案2】:

目前没有办法实现这一点。我们在参考实现中有一个问题:HV-823

这将解决 Hibernate Validator 方面的问题(即从 Path.Node#getName() 返回您期望的名称),它需要更多检查 Spring 是否真的从那里获取名称。

也许您有兴趣帮助实现这个?

【讨论】:

  • 不久前我写了这个answer。它是关于如何解析约束违规,然后使用 Jackson 来查找实际的 JSON 属性名称。
  • Spring 从SpringValidatorAdapter.determineField(ConstraintViolation<Object> violation) 获得了“字段”名称,并且根据 Javadoc:The default implementation returns the stringified property path。默认情况下,在 Spring 应用程序中,SpringValidatorAdapter 的实际实例是 LocalValidatorFactoryBean 的子类。
猜你喜欢
  • 1970-01-01
  • 2018-08-15
  • 2011-07-24
  • 2013-11-23
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多