解决spring boot项目启动后访问接口出现日志乱码

本文介绍如何在实现WebMvcConfigurer接口的配置类中,通过添加自定义的HttpMessageConverter来解决响应体中文乱码的问题。具体步骤包括创建StringHttpMessageConverter实例,并指定UTF-8编码,然后将其添加到消息转换器列表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实现WebMvcConfigurer类的WebConfig中添加代码如下

@Bean
public HttpMessageConverter<String> responseBodyConverter() {
    StringHttpMessageConverter converter = new StringHttpMessageConverter(
            Charset.forName("UTF-8"));
    return converter;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(responseBodyConverter());
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false);
}

重新启动项目进行访问,控制台打印的日志不再出现中文乱码。

<think>好的,用户之前已经问过如何在Spring Boot中自定义文本内容并下载文件,现在他们又问了类似的问题,但这次更明确地提到要自定义txt文件的内容并下载。我需要确保回答准确,并且不要重复之前的内容,但可能需要更详细地针对txt文件进行说明。 首先,用户可能已经看过之前的回答,但可能还不太清楚如何具体应用到txt文件。或者他们可能需要更简化的步骤。我需要检查之前的回答是否已经涵盖了这种情况。在之前的回复中,我提到了使用字节数组、ResponseEntity和本地文件下载等方法,这些同样适用于txt文件。 不过,用户现在特别强调自定义txt内容,可能需要一个更直接的例子,比如动态生成文本内容然后下载为txt文件。需要确保示例代码是专门针对txt文件的,包括正确的内容类型设置和文件名设置。 另外,用户可能对如何构建文本内容有疑问,比如如何换行、处理编码问题等。在注意事项中,我需要强调UTF-8编码的重要性,以及如何处理中文文件名的问题,避免乱码。 可能还需要提到不同的方法之间的区别,比如直接操作HttpServletResponse和使用ResponseEntity的优势,比如后者更符合Spring的惯例,代码更简洁,可测试性更好。 需要检查是否有遗漏的关键点,例如设置Content-Disposition头部,正确关闭流,以及如何处理大文件的情况。不过由于用户提到的是自定义内容,可能内容不会太大,但还是要提到最佳实践,比如使用缓冲流。 另外,用户可能是在开发某个需要生成报告或日志下载的功能,所以示例中的动态内容部分可能需要更贴近实际应用,比如添加时间戳或用户特定的数据。 最后,确保回答结构清晰,分步骤说明,让用户能一步步跟随操作,同时提供不同的方法选项,方便他们根据项目需求选择。</think>在 Spring Boot 中实现动态生成 TXT 文件内容并下载,可通过以下三种典型方式实现(含完整代码示例和最佳实践): --- ### 一、基础版:直接操作 HttpServletResponse ```java @GetMapping("/download/direct") public void downloadDirect(HttpServletResponse response) throws IOException { // 动态生成文本内容(示例:带时间戳的日志) String content = "=== 动态生成内容 ===\n" + "时间: " + LocalDateTime.now() + "\n" + "内容: 这是动态生成的TXT文件\n" + "行尾测试:Windows换行\r\n 和Linux换行\n"; // 必须设置响应头 response.setContentType("text/plain; charset=UTF-8"); // MIME类型 response.setCharacterEncoding("UTF-8"); // 编码强制指定 response.setHeader("Content-Disposition", "attachment; filename=\"dynamic-content.txt\""); // 使用try-with-resources自动关闭流 try (PrintWriter writer = response.getWriter()) { writer.write(content); } // 不需要手动flush/close } ``` --- ### 二、进阶版:使用 ResponseEntity(推荐) ```java @GetMapping("/download/entity") public ResponseEntity<byte[]> downloadByEntity() { // 动态构建内容(示例:CSV格式转TXT) StringBuilder sb = new StringBuilder(); sb.append("ID,Name,Email\n"); sb.append("1,张三,zhangsan@example.com\n"); sb.append("2,李四,lisi@example.com\n"); // 处理中文文件名(防止乱码) String fileName = "用户数据.txt"; String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8) .replace("+", "%20"); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_TYPE, "text/plain; charset=UTF-8") .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFileName) .body(sb.toString().getBytes(StandardCharsets.UTF_8)); } ``` --- ### 三、专业版:结合 Resource 接口 ```java @GetMapping("/download/resource") public ResponseEntity<Resource> downloadResource() { // 动态生成内容(示例:带随机数的测试文件) String content = IntStream.range(0, 50) .mapToObj(i -> "随机数 " + i + ": " + (int)(Math.random()*100)) .collect(Collectors.joining("\n")); // 创建内存中的资源文件 ByteArrayResource resource = new ByteArrayResource(content.getBytes(StandardCharsets.UTF_8)); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"random-numbers.txt\"") .contentType(MediaType.TEXT_PLAIN) .contentLength(resource.contentLength()) .body(resource); } ``` --- ### 四、企业级最佳实践 #### 1. 使用模板引擎动态生成 ```java @Autowired private TemplateEngine templateEngine; // Thymeleaf 或 FreeMarker @GetMapping("/download/template") public ResponseEntity<Resource> templateDownload() { // 构建数据模型 Map<String, Object> model = new HashMap<>(); model.put("title", "系统报告"); model.put("generationDate", LocalDate.now()); model.put("items", Arrays.asList("错误日志", "访问记录", "性能数据")); // 渲染模板 String content = templateEngine.process("report-template.txt", new Context(Locale.CHINA, model)); // 返回资源 return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"系统报告.txt\"") .body(new ByteArrayResource(content.getBytes(StandardCharsets.UTF_8))); } ``` #### 2. 大文件流式处理 ```java @GetMapping("/download/large-file") public ResponseEntity<StreamingResponseBody> streamDownload() { // 创建流式响应体 StreamingResponseBody stream =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iamlzjoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值