У меня есть приложение Spring Boot, использующее аннотации javax.validation
, и я пытаюсь вернуть дружественные 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
в качестве стандарта, изменение для упрощения задачи не является решением.
Я полагаю, что ObjectMapper
Джексона можно было бы каким-то образом использовать для этого преобразования или какой-либо другой части API Джексона, но я ничего не мог найти об этом. Подойдет и любая другая библиотека, которая может это сделать (в идеале она должна понимать аннотации Джексона, такие как @JsonProperty
).