【问题标题】:Spring Boot Return Plain Text without ResponseBody annotationSpring Boot 返回没有 ResponseBody 注释的纯文本
【发布时间】:2021-10-06 16:27:02
【问题描述】:

我想返回纯文本消息 Spring Boot Controller Method 中的@ResponseBody 注解。

通常当我返回一个字符串时,这会出错。 (实际上它会寻找一个 html 文件。)

@GetMapping("/test/message")
    public String Message() {
        
        return "This is a plain Text";
    }

当我使用这段代码时,这会返回一个错误

解析模板时出错 [这是纯文本],模板可能不存在或可能无法被任何已配置的模板解析器访问 org.thymeleaf.exceptions.TemplateInputException:解析模板时出错[这是纯文本],模板可能不存在或可能无法被任何已配置的模板解析器访问

我的预期结果(不使用响应体) 这是纯文本

ResponseBody 的问题是它只能响应纯文本或 html 文件。我想自己控制它。

【问题讨论】:

  • 如果不指定@ResponseBody,Spring 会尝试将响应解析为模板名称。没看懂,@ResponseBody 有什么问题?您可以通过@RequestMapping注解的produces变量控制响应类型
  • @RequestMapping(produces="text") 是这样的吗?
  • 对于文本,它应该是@RequestMapping(produces = "text/plain")。附: @GetMapping 也有这个参数,所以你可以将你的端点声明为@ResponseBody @GetMapping("/test/message", produces = "text/plain")
  • 试过这个`@GetMapping(value = "/test/message",produces = "text/plain")`仍然存在错误
  • 您的问题有点表述为X-Y problem。您是否绝对要删除 @ResponseBody 注释,或者您是否正在尝试解决潜在问题?

标签: java spring-boot thymeleaf


【解决方案1】:

一个解决方案可能是

@GetMapping("/test/message")
public ResponseEntity<String> Message() {
    return new ResponseEntity<>("This is a plain Text", HttpStatus.OK);
}

【讨论】:

  • 感谢您的回答。使用此解决方案我可以渲染 html 模板吗?我想通过 if else 条件在同一方法中打印纯文本和 html 模板。
  • 从技术上讲,您可以渲染模板并将它们作为字符串返回,是的。但我想不出你真正想要这个的单一情况。这样做将是一个架构缺陷,并且混合多个职责会破坏 SOLID 中的 S。
【解决方案2】:

您可以在控制器方法中直接将HttpServletResponse作为参数,通过设置contentType将任何数据写入HttpServletResponse,也可以使用PrintStream直接在响应对象中写入输出。

public void getData(HttpServletResponse res) {
    InputStream in = servletContext.getResourceAsStream("url");
    res.setContentType("Any content type");
    IOUtils.copy(in, response.getOutputStream());
}

PrintStream print = new PrintStream(res);
print.write("data");

【讨论】:

    【解决方案3】:

    基本上,如果您使用@RestController 注解来注解您的控制器,那么响应可以作为纯文本返回。当你想将它渲染到模板时,使用@Controller 注解。

    @Controller
    class MyThymeleafController {
    
        @GetMapping("/greeting")
        public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
            return "greeting";//renders a template
        }
    }
    
    @RestController
    class MyRestController {
    
        @GetMapping("/hello")
        public String helloWorld() {
            return "Hello World";//renders plain text
        }
    }
    

    https://github.com/faskan/spring-boot-thymeleaf-sample

    如果您能解释为什么需要以相同的方法呈现模板或字符串,那就太好了。

    【讨论】:

    • 好的。那很好。但休息控制器是另一回事。我需要一个额外的控制器。 @Controller 可以吗?实际上,我想向用户显示单行消息(可能是任何验证消息或警告)并进行调试,我想在同一方法中执行此操作。
    猜你喜欢
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2020-08-05
    • 1970-01-01
    相关资源
    最近更新 更多