首页 > 解决方案 > 如何用@Email 注释替换占位符消息

问题描述

我知道如何在 Spring 中用实际值替换占位符,并且在我的应用程序中事情对我有用,但我的问题特定于以下用例。

甚至可以将 ${malformed.email.address} 替换为属性文件中的实际值吗?

@RequestMapping(value = "/forgot-password", method = RequestMethod.POST)
public ResponseEntity<String> forgotPassword(@RequestBody @Email(message = "${malformed.email.address}") @NotNull String emailAddress, UriComponentsBuilder ucBuilder) {

    System.out.println("Forgot password for User : " + emailAddress);

    try {
        userService.forgotPassword(emailAddress);

        return new ResponseEntity<String>("If " + emailAddress + " existed then you should receive an email soon.", HttpStatus.OK);
    } catch (ServiceException e) {
        throw new ControllerRuntimeException(e);
    }
}

我有这个配置:

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
    return new MethodValidationPostProcessor();
}

我在类路径中有 messages.properties 文件,并且填充了 spring 的 Environment 对象。

这是我的异常处理程序:

@ControllerAdvice
public class ConstraintViolationExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleValidationException(ConstraintViolationException e) {
    for (ConstraintViolation<?> s : e.getConstraintViolations()) {
        return s.getInvalidValue() + ": " + s.getMessage();
    }
    return "Invalid request supplied";
  }
}

这是我得到的回应:

WARN | 2019-02-05 00:21:16,622 | 
org.hibernate.validator.internal.engine.messageinterpolation.ElTermResolver |   HV000129: EL expression '${malformed.email.address}' references an unknown 
property
javax.el.PropertyNotFoundException: ELResolver cannot handle a null base 
Object with identifier [malformed]
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:120)
at org.apache.el.parser.AstValue.getValue(AstValue.java:137)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
at org.hibernate.validator.internal.engine.messageinterpolation.ElTermResolver.interpolate(ElTermResolver.java:65)
at org.hibernate.validator.internal.engine.messageinterpolation.InterpolationTerm.interpolate(InterpolationTerm.java:64)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolate(ResourceBundleMessageInterpolator.java:75)
at org.hibernate.validator.messageinterpolation.AbstractMessageInterpolator.interpolateExpression(AbstractMessageInterpolator.java:387)
at org.hibernate.validator.messageinterpolation.AbstractMessageInterpolator.interpolateMessage(AbstractMessageInterpolator.java:344)

标签: spring

解决方案


推荐阅读