springboot项目中文乱码
解决方案:
- 在application.properties中添加以下配置:
# 设置字符集编码
spring.http.encoding.charset=utf-8
# 设置请求编码
spring.http.encoding.force-request=true
# 设置响应编码
spring.http.encoding.force-response=true
- 在实体类上添加注解,指定字符集为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;
}
- 在@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("请求参数解析失败,请检查参数是否正确");
}
}
}
- 在拦截器中添加过滤器,处理请求和响应中的字符集编码:
@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("/**");
}
}
``
原文地址: https://www.cveoy.top/t/topic/egBb 著作权归作者所有。请勿转载和采集!