From bce5cbda9588e4a144191aaa2485ac84f8e8721f Mon Sep 17 00:00:00 2001 From: pbvfus8to <480171784@qq.com> Date: Wed, 18 Dec 2024 11:19:03 +0800 Subject: [PATCH] Update HttpHandler.java --- .../yami/shop/common/handler/HttpHandler.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/handler/HttpHandler.java b/yami-shop-common/src/main/java/com/yami/shop/common/handler/HttpHandler.java index ff19f1b..24193d0 100644 --- a/yami-shop-common/src/main/java/com/yami/shop/common/handler/HttpHandler.java +++ b/yami-shop-common/src/main/java/com/yami/shop/common/handler/HttpHandler.java @@ -18,17 +18,37 @@ import java.io.PrintWriter; import java.util.Objects; /** + * HttpHandler类是一个Spring组件,主要用于处理将服务器响应信息输出到Web端的相关操作,它能够将封装好的响应实体(ServerResponseEntity)或者特定的业务异常(YamiShopBindException)信息 + * 按照合适的格式(JSON格式)写入到HTTP响应中,以便前端能够正确接收并解析后端返回的结果,同时在处理过程中进行了一些必要的日志记录以及异常处理,保证操作的稳定性和可靠性。 + * * @author 菠萝凤梨 * @date 2022/3/28 14:15 */ @Component +// 使用@Component注解将该类标记为Spring的组件,使得Spring能够扫描并管理这个类,将其纳入到Spring容器中,方便进行依赖注入等操作。 public class HttpHandler { + // 创建一个名为logger的静态常量,用于记录日志信息,通过LoggerFactory获取HttpHandler类对应的Logger实例,方便在类的各个方法中记录不同级别的日志, + // 例如记录操作过程中的错误信息、调试信息等,有助于排查问题和了解程序的执行情况。 private static final Logger logger = LoggerFactory.getLogger(HttpHandler.class); + // 使用@Autowired注解进行依赖注入,将Spring容器中管理的ObjectMapper实例注入到当前类中,ObjectMapper主要用于将Java对象转换为JSON字符串(序列化)以及将JSON字符串转换为Java对象(反序列化), + // 在将ServerResponseEntity对象转换为JSON格式并写入HTTP响应时会用到它。 @Autowired private ObjectMapper objectMapper; + /** + * 将ServerResponseEntity对象转换为JSON格式并输出到Web端(即写入HTTP响应)的方法。 + * 首先会对传入的ServerResponseEntity对象进行判空处理,如果为空则记录相应的日志信息并直接返回,不进行后续操作。 + * 接着获取当前请求的相关属性(ServletRequestAttributes),如果获取失败(为null)则记录错误日志并返回,因为没有请求上下文就无法进行响应输出操作。 + * 然后获取HttpServletResponse对象,如果该对象也为null同样记录错误日志并返回。 + * 之后设置响应的字符编码为UTF-8,并指定响应的内容类型为JSON格式(通过设置ContentType为APPLICATION_JSON_VALUE), + * 最后通过ObjectMapper将ServerResponseEntity对象转换为JSON字符串,并使用PrintWriter将其写入到HTTP响应中,如果在写入过程中出现IOException异常, + * 则抛出YamiShopBindException异常,并将原始的IOException作为原因封装进去,以便上层调用者能够处理这个异常情况。 + * + * @param serverResponseEntity 封装了服务器响应信息(如响应码、消息、响应数据等)的实体对象,需要将其转换为JSON格式并输出到HTTP响应中,供前端接收和解析。 + * @param 泛型参数,表示ServerResponseEntity中响应数据部分的类型,其具体类型取决于实际业务逻辑中返回的数据类型。 + */ public void printServerResponseToWeb(ServerResponseEntity serverResponseEntity) { if (serverResponseEntity == null) { logger.info("print obj is null"); @@ -36,7 +56,7 @@ public class HttpHandler { } ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder - .getRequestAttributes(); + .getRequestAttributes(); if (requestAttributes == null) { logger.error("requestAttributes is null, can not print to web"); return; @@ -59,6 +79,16 @@ public class HttpHandler { } } + /** + * 处理将YamiShopBindException异常信息输出到Web端(写入HTTP响应)的方法。 + * 首先对传入的YamiShopBindException对象进行判空处理,如果为空则记录相应日志信息并返回,不进行后续操作。 + * 接着判断该异常对象中是否已经包含了ServerResponseEntity对象(即是否已经有了预先定义好的响应实体),如果有则直接调用printServerResponseToWeb方法将其输出到HTTP响应中并返回。 + * 如果异常对象中不包含ServerResponseEntity对象,则创建一个新的ServerResponseEntity对象,将异常的错误码(通过getCode方法获取)和错误消息(通过getMessage方法获取)设置到这个新的响应实体中, + * 然后再调用printServerResponseToWeb方法将其输出到HTTP响应中,使得前端能够接收到关于异常的详细信息,以合适的格式展示给用户或者进行相应的错误处理。 + * + * @param yamiShopBindException 业务异常对象,包含了业务逻辑中出现错误时的相关信息,如错误码、错误消息等,需要将这些信息以合适的格式输出到HTTP响应中,以便前端知晓出现的问题。 + * @param 泛型参数,在这里主要是为了与printServerResponseToWeb(ServerResponseEntity)方法的参数类型保持一致,在实际使用中具体类型取决于业务逻辑中响应数据的类型情况。 + */ public void printServerResponseToWeb(YamiShopBindException yamiShopBindException) { if (yamiShopBindException == null) { logger.info("print obj is null"); @@ -75,4 +105,4 @@ public class HttpHandler { serverResponseEntity.setMsg(yamiShopBindException.getMessage()); printServerResponseToWeb(serverResponseEntity); } -} +} \ No newline at end of file