我的配置文件中有一些值,它应该是 JSON(它将作为字符串加载)。
我希望 Spring 在注入(inject)之前验证该值确实是有效的 JSON,否则抛出错误。
我已经阅读了现有的验证注释,例如 - @NotNull
、@Size
、@Min
、 @Max
、@Email
、@NotEmpty
等
有什么方法可以创建自定义 validator 吗?
我想要一个 validator 来尝试将字符串转换为 JSON,如下例所示:How to convert jsonString to JSONObject in Java .
最佳答案
可用的验证注释未提供此功能,因此您必须采用自定义实现。该任务分为 2 个简单步骤:
<强>1。给定的字符串是否为 JSON 格式
有多个库能够解析(从而验证)字符串是否遵循 JSON 语法标准。让我们以我最喜欢的 GSON 为例(有 many )。这取决于您当前使用的库:
String string = "{\"foo\":\"bar\"}"
JsonParser jsonParser = new JsonParser();
try {
jsonParser.parse(string); // valid JSON
} catch (JsonSyntaxException ex) {
/* exception handling */ // invalid JSON
}
<强>2。自定义验证注释
首先提供启用验证的依赖项:
- groupId:
org.hibernate
- artifactId:
hibernate-validator
创建用于验证的注释:
@Documented
@Constraint(validatedBy = JsonStringValidator.class)
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonString {
String message() default "The String is not in JSON format";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
...以及 validator 通过注释处理验证:
public class JsonStringValidator implements ConstraintValidator<JsonString, String> {
@Override
public void initialize(JsonString jsonString) { }
@Override
public boolean isValid(String string, ConstraintValidatorContext context) {
// Use an implementation from step 1. A brief example:
try {
new JsonParser().parse(string);
return true; // valid JSON, return true
} catch (JsonSyntaxException ex) {
/* exception handling if needed */
}
return false; // invalid JSON, return false
}
}
用法非常简单:
@JsonString
private String expectedJsonString
此实现在 Baeldung's 中有详细描述。 .
关于java - Spring验证字符串值是JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59203967/