首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring 2.0.X属性异常处理程序响应ascii?

Spring 2.0.X属性异常处理程序响应ascii?
EN

Stack Overflow用户
提问于 2018-09-22 01:59:35
回答 3查看 622关注 0票数 0

各位,我使用的是引导2.0.x,项目编码和字符集都是UTF-8,请求和响应相同,但是当使用bean验证2来转换错误消息时,它会显示ascii? 1:定义了一个bean,比如BeanValidation.java:

代码语言:javascript
运行
复制
@Data
public class BeanValidation implements Serializable{
    private static final long serialVersionUID = 6265504102271769397L;
    @Email(message = "{bv2.email.invalid}")
    @NotEmpty(message = "{bv2.email.required}")
    private String email;
}

2:使用全局异常处理程序:

代码语言:javascript
运行
复制
    @RestControllerAdvice
public class GenericExceptionHandler 
    extends ResponseEntityExceptionHandler 
    implements ErrorController{
    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid1(
        MethodArgumentNotValidException ex,
        HttpHeaders headers,HttpStatus status,WebRequest request) {
        BindingResult br = ex.getBindingResult();
        List<String> errorList = new ArrayList<String>();
        br.getFieldErrors().forEach(fe -> {
            errorList.add(fe.getField() + ":" + fe.getDefaultMessage());
        });
        br.getGlobalErrors().forEach(ge -> {
            errorList.add(ge.getObjectName() + ":" + ge.getDefaultMessage());
        });
        ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ex.getLocalizedMessage(), errorList);
        return handleExceptionInternal(ex, apiError, headers, apiError.getStatus(), request);
    }
}

3:定义ValidationMessages.properties:

代码语言:javascript
运行
复制
bv2.email.invalid = mail address is invalid,邮件地址无效!
bv2.email.required = mail address is required,邮件地址为必填项!

4:编写控制器来处理请求:

代码语言:javascript
运行
复制
@PostMapping("/bv2")
public Boolean jsr380(@Valid @RequestBody BeanValidation bv2) {
    return null == bv2 ? false : true;
}

5:通过邮递员启动应用程序和请求,请求参数为:http://localhost:12345/contextPath/bv2,请求数据:

代码语言:javascript
运行
复制
{"email":"email address"}

答复结果:

代码语言:javascript
运行
复制
{
            "timestamp": "2018-09-22T01:50:09.729+0000",
            "status": "400",
            "error": "Bad Request",
            "errors": [
                {
                    "defaultMessage": "mail address is invalid,é\u0082®ä»¶å\u009c°å\u009d\u0080æ\u0097 æ\u0095\u0088!",
                    "objectName": "beanValidation",
                    "field": "email",
                    "rejectedValue": "email address",
                    "bindingFailure": false,
                    "code": "Email"
                }
            ],
            "message": "Bad Request",
            "path": "/contextPath/bv2"
        }
  1. 它响应成功,但它自动编码ascii,所以我的问题是:"defaultMessage":“邮件地址无效,é\u009c°u009d\u0080\u0097\u 0095\u 0088!”,

当我使用简单的中文时,它会出现如ascii代码,如何显示或解码为正常,如:

代码语言:javascript
运行
复制
mail address is invalid,邮件地址无效!
        mail address is required,邮件地址为必填项!

谢谢大家!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-25 07:14:22

我把它作为一种全球性的方式解决了:

代码语言:javascript
运行
复制
@Configuration

公共类WebConfig实现WebMvcConfigurer{

代码语言:javascript
运行
复制
@Override
public Validator getValidator() {
    return validator();
}

@Bean
public LocalValidatorFactoryBean validator() {
    final LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
    validator.setValidationMessageSource(messageSource());
    return validator;
}

/**
 * @title:messageSource:base name sequence:i18n and bean validation use this
 * [baseName]_[language]_[script]_[region]_[variant]
 * [baseName]_[language]_[script]_[region]
 * [baseName]_[language]_[script]
 * [baseName]_[language]_[region]_[variant]
 * [baseName]_[language]_[region]
 * [baseName]_[language]
 * @return MessageSource
 * @create 2018-09-25 09:32:24
 * @author:elf
 * @since:1.0.0
 */
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
    ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
    String[] baseNameArray = {
        "classpath:i18n/msg",
        "classpath:i18n/bvMsg",
        "classpath:i18n/commonMsg",
    };
    source.setBasenames(baseNameArray);
    source.setDefaultEncoding(StandardCharsets.UTF_8.name());
    return source;
}

}

src/main/resources/i18n/bvMsg下的bvMsg.properties

代码语言:javascript
运行
复制
bv2.price.min = 最低价格是666!
bv2.price.positive = 价格必须是正数!

bv2.email.invalid = 邮件地址无效!
bv2.email.required = 邮件地址为必填项!

答复如下:

代码语言:javascript
运行
复制
{
"timestamp": "2018-09-25T07:05:03.420+0000",
"status": "400",
"error": "Bad Request",
"errors": [
    {
        "codes": [
            "Positive.beanValidation.price",
            "Positive.price",
            "Positive.java.lang.Integer",
            "Positive"
        ],
        "arguments": [
            {
                "codes": [
                    "beanValidation.price",
                    "price"
                ],
                "arguments": null,
                "defaultMessage": "price",
                "code": "price"
            }
        ],
        "defaultMessage": "价格必须是正数!",
        "objectName": "beanValidation",
        "field": "price",
        "rejectedValue": "-333",
        "bindingFailure": false,
        "code": "Positive"
    },
    {
        "codes": [
            "Email.beanValidation.email",
            "Email.email",
            "Email.java.lang.String",
            "Email"
        ],
        "arguments": [
            {
                "codes": [
                    "beanValidation.email",
                    "email"
                ],
                "arguments": null,
                "defaultMessage": "email",
                "code": "email"
            },
            [],
            {
                "arguments": null,
                "defaultMessage": ".*",
                "codes": [
                    ".*"
                ]
            }
        ],
        "defaultMessage": "邮件地址无效!",
        "objectName": "beanValidation",
        "field": "email",
        "rejectedValue": "fdsaomc.com",
        "bindingFailure": false,
        "code": "Email"
    },
    {
        "codes": [
            "Min.beanValidation.price",
            "Min.price",
            "Min.java.lang.Integer",
            "Min"
        ],
        "arguments": [
            {
                "codes": [
                    "beanValidation.price",
                    "price"
                ],
                "arguments": null,
                "defaultMessage": "price",
                "code": "price"
            },
            "666"
        ],
        "defaultMessage": "最低价格是666!",
        "objectName": "beanValidation",
        "field": "price",
        "rejectedValue": "-333",
        "bindingFailure": false,
        "code": "Min"
    }
],
"message": "Bad Request",
"path": "/contextPath/bv2"

}

票数 0
EN

Stack Overflow用户

发布于 2018-09-22 02:32:30

根据我的经验,您可以在文件“xxx.properties”中这样做

bv2.email.invalid = mail address is invalid,é\u0082®ä»¶å\u009c°å\u009d\u0080æ\u0097 æ\u0095\u0088!

票数 1
EN

Stack Overflow用户

发布于 2018-09-22 06:24:11

在属性文件中定义默认编码类型。

试着使用

代码语言:javascript
运行
复制
spring.messages.encoding=UTF-8

在application.properties文件中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52452840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档