解决方案:

  1. 在application.properties中添加以下配置:
# 设置字符集编码
spring.http.encoding.charset=utf-8
# 设置请求编码
spring.http.encoding.force-request=true
# 设置响应编码
spring.http.encoding.force-response=true
  1. 在实体类上添加注解,指定字符集为UTF-8:
@Entity
@Table(name = "user")
@org.hibernate.annotations.Table(appliesTo = "user", comment = "用户表")
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", nullable = false, columnDefinition = "varchar(50) COMMENT '姓名'")
    @org.hibernate.annotations.ColumnDefault("'未知'")
    @NotBlank(message = "姓名不能为空")
    @Size(max = 50, message = "姓名长度不能超过50个字符")
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @JsonProperty("name")
    private String name;

    @Column(name = "age", nullable = false, columnDefinition = "int(11) COMMENT '年龄'")
    @org.hibernate.annotations.ColumnDefault("0")
    @Min(value = 0, message = "年龄不能小于0")
    @Max(value = 200, message = "年龄不能大于200")
    @JsonFormat(shape = JsonFormat.Shape.NUMBER_INT)
    @JsonProperty("age")
    private Integer age;

    @Column(name = "sex", nullable = false, columnDefinition = "varchar(10) COMMENT '性别'")
    @org.hibernate.annotations.ColumnDefault("'未知'")
    @NotBlank(message = "性别不能为空")
    @Size(max = 10, message = "性别长度不能超过10个字符")
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @JsonProperty("sex")
    private String sex;

    @Column(name = "address", nullable = true, columnDefinition = "varchar(100) COMMENT '地址'")
    @org.hibernate.annotations.ColumnDefault("''")
    @Size(max = 100, message = "地址长度不能超过100个字符")
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @JsonProperty("address")
    private String address;

    @CreatedDate
    @Column(name = "created_at", nullable = false, updatable = false, columnDefinition = "timestamp default current_timestamp COMMENT '创建时间'")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonProperty("created_at")
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Column(name = "updated_at", nullable = false, columnDefinition = "timestamp default current_timestamp on update current_timestamp COMMENT '更新时间'")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonProperty("updated_at")
    private LocalDateTime updatedAt;
}
  1. 在@ControllerAdvice中添加全局异常处理方法,处理乱码异常:
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(HttpMessageNotReadableException.class)
    @ResponseBody
    public Response handleHttpMessageNotReadableException(HttpMessageNotReadableException ex) {
        String message = ex.getCause().getMessage();
        if (message.contains("UTF-8")) {
            return Response.fail("请求参数中存在中文乱码,请检查参数是否正确");
        } else {
            return Response.fail("请求参数解析失败,请检查参数是否正确");
        }
    }
}
  1. 在拦截器中添加过滤器,处理请求和响应中的字符集编码:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Bean
    public FilterRegistrationBean<CharacterEncodingFilter> characterEncodingFilterRegistrationBean() {
        FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>();
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        registrationBean.setFilter(characterEncodingFilter);
        registrationBean.setName("characterEncodingFilter");
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                request.setCharacterEncoding("UTF-8");
                response.setContentType("text/html;charset=UTF-8");
                return true;
            }
        }).addPathPatterns("/**");
    }
}
``
springboot项目中文乱码

原文地址: https://www.cveoy.top/t/topic/egBb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录