gpt4 book ai didi

java - 如何为 i18n 构建验证错误代码

转载 作者:行者123 更新时间:2023-11-30 02:36:33 25 4
gpt4 key购买 nike

我正在使用 Spring MVC 框架编写 REST-API。
我正在使用 bean 验证,例如:

class Person {
@NotNull
String name;
@NotNull
String email;
@Min(0)
Integer age;
}

我正在使用 @Valid 注释验证 Person 到 Controller 中:

@PostMapping
public Person create(@Valid @RequestBody Person person) {return ...;}

为了使错误易于理解,我使用 spring 的顶级错误处理程序:

@ControllerAdvice
public class CustomExceptionHandler {

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody String handle(MethodArgumentNotValidException ex) {
List<String> errors = ex.getBindingResult().getFieldErrors().stream()
.map(this::buildMessage)
.collect(Collectors.toList());
return errors.toString();
}

private String buildMessage(FieldError fe) {
return fe.getField() + " " + fe.getDefaultMessage();
}
}

所以我的错误看起来像:[名称可能不为空,电子邮件可能不为空]

现在我需要使用独立于语言的错误代码,它将由不同的 UI 解析来实现 i18n。
有没有办法构建完整的错误代码?(包含字段名称)

我看到以下解决方案:

  1. 每次使用注释时都使用自定义消息(丑陋):

    class Person {
    @NotNull(message="app.error.person.name.not.null")
    String name;
    @NotNull(message="app.error.person.email.not.null")
    String email;
    @Min(0)(message="app.error.person.age.below.zero")
    Integer age;
    }
  2. 将正确的代码构建到我的异常处理程序中(不知道如何):

    private String buildMessage(FieldError fe) {
    return "app.error." +
    fe.getObjectName() + "." +
    fe.getField() + "." +
    fe.getDefaultMessage().replaceAll("\\s", "");//don't know how to connect to concrete annotation
    }

    因此消息将类似于 app.error.person.name.maynotbenull

  3. 通过删除默认的 ConstraintViolation 并添加自定义(开销)来重写所有注释和 validator ,以构建正确的消息

最佳答案

无需在注释中指定消息。这将是一个开销

@ControllerAdvice
public class CustomExceptionHandler {

@Autowired
MessageSource messageSource;

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody String handle(MethodArgumentNotValidException ex) {
List<String> errors = ex.getBindingResult().getFieldErrors().stream()
.map(this::buildMessage)
.collect(Collectors.toList());
return errors.toString();
}

private String buildMessage(FieldError fe) {
StringBuilder errorCode = new StringBuilder("");
String localizedErrorMsg = "";
errorCode.append("error").append(".");
errorCode.append(fe.getObjectName()).append(".");
errorCode.append(fe.getField()).append(".");
errorCode.append(fe.getCode().toLowerCase());

try {
localizedErrorMsg = this.messageSource.getMessage(errorCode,(Object[]) null, LocaleContextHolder.getLocale());
} catch (Exception ex) {
localizedErrorMsg = fe.getDefaultMessage();
}
return localizedErrorMsg;
}
}

并在消息文件(i18n)中使用以下格式

error.person.name.notnull = Name must not be null
error.person.email.notnull = Email must not be null
error.person.age.min= Minimum age should greater than 0.

使用此功能,您不必在注释中编写任何消息代码。希望这会有所帮助。

关于java - 如何为 i18n 构建验证错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42905298/

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