【发布时间】:2020-08-04 13:57:02
【问题描述】:
我有一个使用 javax.validation 注释的 Spring Boot 应用程序,我试图返回指向违规字段的友好 JSON 错误消息,但是从可用的“Java-object”路径转换为 JSONPath 或 JSON 指针是什么我没有找到办法。
SSCO 示例:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import javax.validation.Valid;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.Min;
import java.util.List;
public class Test {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
Data data = new Data();
System.out.println("Serialized: " + mapper.writerWithDefaultPrettyPrinter().writeValueAsString(data));
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
validator.validate(data).forEach(violation -> {
System.out.println("Path: " + violation.getPropertyPath());
});
}
public static class Data {
@JsonProperty("foobar")
@Valid
public List<Foo> foo = List.of(new Foo());
}
public static class Foo {
@Min(100)
public int barBaz = 42;
}
}
输出:
Serialized: {
"foobar" : [ {
"bar_baz" : 42
} ]
}
Path: foo[0].barBaz
如您所见,我需要将foo[0].barBaz 转换为$.foobar[0].bar_baz 或/foobar/0/bar_baz。解析后的对象(上面的data 变量)也由保存验证信息的BindingResult 对象提供。
我想过做一些字符串操作,但那很麻烦,很麻烦,而且很容易被 @JsonProperty 打破,我需要单独处理,也许还有其他我没有考虑过的极端情况。另外,我们以SNAKE_CASE 为标准,为了简化任务而进行更改不是解决方案。
我想 Jackson 的 ObjectMapper 可以以某种方式用于进行这种转换,或者其他一些 Jackson API,但我找不到任何相关信息。任何其他可以做到这一点的库也很好(理想情况下,它应该理解 Jackson 注释,如 @JsonProperty)。
【问题讨论】:
标签: java spring jackson jackson-databind spring-validator