gpt4 book ai didi

java - 使用 springframework 验证错误验证枚举

转载 作者:行者123 更新时间:2023-12-03 08:22:09 24 4
gpt4 key购买 nike

TL;DR : org.springframework.validation.Errors 未捕获枚举反序列化错误在休息 Controller 中

供引用:我们还没有找到一个干净的解决方案,因为我们最终决定没有人应该用错误的枚举来称呼我们

我有一个使用 org.springframework.validation.Errors 的休息 Controller 对于参数验证:

@RequestMapping(value = "/vol1/frodo")
public ResponseEntity<Object> simpleMethodUsingPost(
HttpServletRequest httpServletRequest,
@Valid @RequestBody MySimpleObject simpleObject,
Errors errors) {

/* If an error occured, I need to log the object */
if (errors.hasErrors()) {
List<FieldError> fields = errors.getFieldErrors();
doSomething(fields , simpleObject);
}
}

我的类(class) MySimpleObject看起来像这样:
public class MySimpleObject {
@Valid
@NotNull(message = "anObjectField is a mandatory field")
private EmbeddedObject anObjectField = null;

@Valid
@NotNull(message = "aStringField is a mandatory field")
private String aStringField = null;

@Valid
private MySimpleEnum aSimpleEnum = null;
}

还有我的枚举类 MySimpleEnum基本上是一个有两个值的类:
public enum MySimpleEnum{

ORC("ORC"),
URUK("URUK");

private String value;

MySimpleEnum(String value) {
this.value = value;
}

@Override
public String toString() {
return String.valueOf(value);
}
}

此对象的验证(以及在 springframework Error 对象中注入(inject)错误)在 String 上运行良好或 Object ,但它将无法验证 enum (因此包含有效注释枚举的对象也会失败)。

尝试转换 JSON 时失败 String当值无效时到枚举:
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: 
Cannot deserialize value of type 'lotr.middleearth.model.MySimpleEnum' from String "HOBBIT"

如果我使用 ResponseEntityExceptionHandler,则会捕获此反序列化错误并覆盖 handleHttpMessageNotReadable ,但是我无法访问其他不同的参数,也无法使用它们。

如何配置 验证人 , 枚举 springframework 错误 以便在我的 Controller 主体中捕获并使用此异常?

最佳答案

我刚刚遇到了同样的问题,但不喜欢给用户一个未格式化的“丑陋”验证错误消息的想法。

首先,我在 pojo 上使 enum 属性不可为空。

@NotNull(message = "Type must be NEW_APPLICATION or RENEWAL")
private RegistrationSubmissionTypeEnum type;

然后我更改了 setter 以基本上检查输入(作为字符串)并查看它是否与其中一个枚举匹配。如果没有,我什么也不做,该属性保持为空,并作为验证错误消息之一报告回来(使用 @NotNull 注释上使用的消息文本)。
public void setType(Object typeInput) {
for (RegistrationSubmissionTypeEnum typeEnum : RegistrationSubmissionTypeEnum.values()) {
if (typeEnum.getKey().equalsIgnoreCase(typeInput.toString())) {
this.type=RegistrationSubmissionTypeEnum.valueOf(typeInput.toString());
}
}
}

这真的是关键。我们都鄙视的正常行为会生成一个丑陋的错误消息,但它也会以一种单独显示此错误消息的方式进行。就个人而言,我喜欢将所有错误全部发回。

我不喜欢在@NotNull 消息上对枚举值进行硬编码,但在这种特殊情况下(少量枚举值),它比默认的枚举序列化错误消息和一次性孤立错误的行为更可取信息。

我考虑过一个自定义 validator ,但开始感觉很沉重。也许有人可以改进这一点。

关于java - 使用 springframework 验证错误验证枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53525359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com