使用HttpServletResponse实现curl接口时控制台输出(续)

使用,httpservletresponse,实现,curl,接口,控制台,输出 · 浏览次数 : 6

小编点评

**解决方案:** 1. **构造一个全局的 HttpServletResponse 对象:** - 在 `WebUtil` 中添加一个 `@Autowired` 注解注入的 `HttpServletResponse` 对象属性。 - 在 `output()` 方法中注入 `webUtil` 对象。 2. **在其他所有需要使用 `HttpServletResponse` 的地方自动注入:** - 在 `TestServiceImpl` 中使用 `@Autowired` 注解注入 `webUtil` 对象。 - 使用 `webUtil` 对象的 `output()` 方法进行控制台输出。 **代码示例:** ```java // WebUtil.java @Component @Resource private HttpServletResponse httpServletResponse; // TestServiceImpl.java @Service @Slf4j public class TestServiceImpl implements TestService { @Autowired private WebUtil webUtil; @Override public boolean emergencyOperation() throws IOException { // ... webUtil.output( "开始执行应急操作任务" ); // ... return true; } } ``` **注意:** - 确保 `webUtil` 在整个应用程序范围内可用。 - 使用 `@Autowired` 注解进行自动注入,确保 `webUtil` 对象被正确注入。 - 使用 `@Resource` 注解指定 `HttpServletResponse` 的属性名称。 - 在 `output()` 方法中使用 `setContentType()` 和 `setCharacterEncoding()` 方法设置输出内容的类型和编码。

正文

上一篇文章的问题

在上一篇文章 Spring Boot RestController接口如何输出到终端 中讨论了如何使用 HttpSerlvetResponse 写入输出流,使应急接口通过 curl 调用时可以在控制台输出信息,使运维人员知道命令执行情况。

但是上一篇文章的问题是,HttpServletResponse 是 Controller 的参数,这就使得如果要在其调用的 Service 方法中也要实现控制台输出,就必须让所有涉及到的 Service 方法都带上 HttpServletResponse 参数,这对业务的侵入实在太大,对于实际业务可能包含多个 Service、Component 之间的相互引用,改造成本是不可容忍的。

本文的解决思路

那么笔者就在想,如何构造一个全局的 HttpServletResponse 对象,使它能够在各个 Controller、Service、Component 之前传递呢?经过查阅资料发现,HttpServletResponse 对象本身是可以被 @Autowired@Resource 注解注入的!那么我们就可以构造一个带有自动注入的 HttpServletResponse 对象的 Component,然后在其他所有需要使用的地方去自动注入这个 Component 即可。

代码

代码实现如下:

@Component
public class WebUtil {
    @Resource
    private HttpServletResponse httpServletResponse;

    public void output(String message) {
        if (httpServletResponse == null) {
            return;
        }
        try {
            httpServletResponse.setContentType("text/plain;charset=utf-8");
            httpServletResponse.setCharacterEncoding("UTF-8");
            PrintWriter writer = httpServletResponse.getWriter();
            writer.println(message);
            writer.flush();
        } catch (Exception e) {
            return;
        }
    }
}

由于我们的目的只是为了实现控制台输出,所以如果该方法抛出异常(主要是 IOExceptionIllegalStatesException),那么直接返回即可。这个问题主要出在定时任务中,因为定时任务是不含 HttpServletResponse 对象的,如果在定时任务中调用该方法的时候会抛出 IllegalStatesException

在要使用该方法的类中使用自动注入,注入 WebUtil 类,然后使用它的对象(而不是这个类本身)的output方法即可。

@Service
@Slf4j
public class TestServiceImpl implements TestService {
    @Resource
    private WebUtil webUtil;

    @Override
    public boolean emergencyOperation() throws IOException {
        log.info("开始执行应急操作任务");
        webUtil.output( "开始执行应急操作任务");
        for (int i = 0; i < 20; i++) {
            webUtil.output( "完成第" + (i+1) + "批次");
            log.info("完成第 {} 批次", i+1);
            try {
                Thread.sleep(500L);
            } catch (InterruptedException e) {
                log.warn("应急操作任务失败");
                webUtil.output( "应急操作任务失败");
                return false;
            }
        }
        log.info("完成应急操作任务");
        webUtil.output( "应急操作任务完成");
        return true;
    }
}

经过测试发现,curl调用接口可以实现控制台输出,定时任务也执行正常,没有预期外的异常产生。

与使用HttpServletResponse实现curl接口时控制台输出(续)相似的内容:

使用HttpServletResponse实现curl接口时控制台输出(续)

上一篇文章的问题 在上一篇文章 Spring Boot RestController接口如何输出到终端 中讨论了如何使用 HttpSerlvetResponse 写入输出流,使应急接口通过 curl 调用时可以在控制台输出信息,使运维人员知道命令执行情况。 但是上一篇文章的问题是,HttpServl

使用EF 连接 数据库 SQLserver、MySql 实现 CodeFirst

1.新建项目,下载Nuget安装包 创建项目需要注意几点,如果是基于 .net framework 的项目 需要选择 相应版本的 EF, 如果是跨平台则选择EF Core版本。 我这里选择的是 .net framework 版本。红框里面是 实现EF Code First 需要的包。 对应的版本:

使用explain优化慢查询的业务场景分析

问:你最害怕的事情是什么? 答:搓澡 问:为什么? 答:因为有些人一旦错过,就不在了 Explain 这个词在不同的上下文中有不同的含义。在数据库查询优化的上下文中,"EXPLAIN" 是一个常用的 SQL 命令,用于显示 SQL 查询的执行计划。执行计划是数据库如何执行查询的一个详细描述,包括它将

使用Github Action来辅助项目管理

Github action 是一个Github官方提供的非常流行且速度集成 持续集成和持续交付(CI/CD)的工具。它允许你在GitHub仓库中自动化、定制和执行你的软件开发工作流。你可以发现、创建和分享用于执行任何你想要的工作的操作,包括CI/CD,并在完全定制的工作流中组合操作。 持续集成需要做

使用 GPU 进行 Lightmap 烘焙 - 简单 demo

作者:i_dovelemon 日期:2024-06-16 主题:Lightmap, PathTracer, Compute Shader 引言 一直以来,我都对离线 bake lightmap 操作很着迷。一方面,这个方案历久弥新,虽然很古老,但是一直在实际项目中都有使用;另一方面,它能够产生非常高

使用 Spring 实现控制反转和依赖注入

使用 Spring 实现控制反转和依赖注入 概述 在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们。 什么是控制反转? 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。 与传

使用Kubesec检查YAML文件安全

使用Kubesec检查YAML文件安全,YAML文件是Kubernetes配置的主要载体,因此,检查YAML文件的安全性对于确保Kubernetes集群的安全至关重要,Kubesec简介,使用Kubesec检查YAML文件安全,kubesec scan podyamlsafe.yaml

使用Microsoft.SemanticKernel基于本地运行的Ollama大语言模型实现Agent调用函数

大语言模型的发展日新月异,记得在去年这个时候,函数调用还是gpt-4的专属。到今年本地运行的大模型无论是推理能力还是文本的输出质量都已经非常接近gpt-4了。而在去年gpt-4尚未发布函数调用时,智能体框架的开发者们依赖构建精巧的提示词实现了gpt-3.5的函数调用。目前在本机运行的大模型,基于这一

使用 TensorRT C++ API 调用GPU加速部署 YOLOv10 实现 500FPS 推理速度——快到飞起!!

NVIDIA ® TensorRT ™ 是一款用于高性能深度学习推理的 SDK,包含深度学习推理优化器和运行时,可为推理应用程序提供低延迟和高吞吐量。YOLOv10是清华大学研究人员近期提出的一种实时目标检测方法,通过消除NMS、优化模型架构和引入创新模块等策略,在保持高精度的同时显著降低了计算开销...

Flutter 借助SearchDelegate实现搜索页面,实现搜索建议、搜索结果,解决IOS拼音问题

使用Flutter自带的SearchDelegate组件实现搜索界面,通过魔改实现如下效果:搜素建议、搜索结果,支持刷新和加载更多,解决IOS中文输入拼音问题。