2022-02-17 二.全局统一返回处理

本文介绍了如何在Spring Boot中实现全局统一返回处理,通过@RestControllerAdvice注解创建一个处理类,将响应数据统一包装,避免在每个Controller方法中手动处理。同时,定义了@NotResponseBody注解用于标记不需要统一处理的方法。这种方法提高了代码的整洁性和可维护性。

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

2022-02-17 全局统一返回处理

前言

统一返回值虽然很好用,但是在每个Controller曾的方法需要手动调用ResponseResult的静态方法,还是不够优雅,可以使用全局统一处理,统一到一个地方进行返回处理。

全局统一返回处理

处理类

package com.zsl.common.advice;

import com.zsl.common.annotation.NotResponseBody;
import com.zsl.common.http.ResponseResult;
import com.zsl.util.JsonUtils;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * 全局处理返回数据
 * @Author zsl
 * @Date 2021/12/29 14:09
 */
@RestControllerAdvice(basePackages = "com.zsl.controller")  //扫描的包
public class ResponseControllerAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        // 返回 true则执行 beforeBodyWrite方法,
        // 返回类型不是 ResponseResult,且没有 @NotResponseBody注解,会执行
        return !methodParameter.getParameterType().equals(ResponseResult.class) && !methodParameter.hasMethodAnnotation(NotResponseBody.class);
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        // 若为 String类型,则直接返回 json字符串
        if (methodParameter.getGenericParameterType().equals(String.class)) {
            return JsonUtils.obj2Str(o);
        }
        return ResponseResult.success(o);
    }
}

注解

当我们不希望被统一返回处理时,添加@NotResponseBody注解进行跳过处理。

package com.zsl.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author zsl
 * @Date 2022/2/17 11:07
 * @Email 249269610@qq.com
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotResponseBody {
}

例子

原先:

@RestController
public class XxxController {

	@Autowired
	XxxService xxxService;

	@RequestMapping("xxx")
	public ResponseResult xxx() {
		return ResponseResult.success(xxxService.xxx());
	}
}

现在:

@RestController
public class XxxController {

	@Autowired
	XxxService xxxService;

	@RequestMapping("xxx")
	public Xxx xxx() {
		return xxxService.xxx();
	}
}

具体的处理由ResponseControllerAdvice来进行统一处理,Controller只需要考虑返回给前端的数据

注意

  • controller层的注解需要使用@RestController(复合注解), 也就是方法需要有@ResponseBody注解才能生效,只有@Controller注解不会经过全局统一返回处理
  • @RestControllerAdvice,最好加上要扫描的包,对basePackages进行赋值

下一篇跳转:3.表单验证

mysql安装配置教程任务描述 本关任务:编写程序,将英文句子转换成摩尔斯电码的小程序。 相关知识 摩斯密码 摩斯密码(又译为摩尔斯电码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬ 摩斯密码表_摩斯密码对照表: 字符 电码符号 字符 电码符号 字符 电码符号 字符 电码符号 A .━ B ━ ... C ━ .━ . D ━ .. E . F ..━ . G ━ ━ . H .... I .. J .━ ━ ━ K ━ .━ L .━ .. M ━ ━ N ━ . O ━ ━ ━ P .━ ━ . Q ━ ━ .━ R .━ . S ... T ━ U ..━ V ...━ W .━ ━ X ━ ..━ Y ━ .━ ━ Z ━ ━ .. ls = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."] 编程要求 根据提示,在右侧编辑器补充代码,将英文句子转换成摩尔斯电码。 测试说明 平台会对你编写的代码进行测试: 测试输入: Attack on Pearl Harbor 预期输出: .---.--.-.-.- ----. .--...-.-..-.. .....-.-.-...---.-. 注意:英文句子里的大写字母先转换为小写字母再译码,不是字母的符号保持原样不变。 text = 'Attack on Pearl Harbor' print(text.lower()) # attack on pearl harbor 开始你的任务吧,祝你成功!def morse_code_encryption(txt): """接收明文字符串为参数,返回用摩斯密码加密后的字符串。""" # 补充你的代码 if __name__ == '__main__':
04-10
<think>嗯,用户想要一个将英文句子转换为摩尔斯电码的Python程序示例。首先,我需要回忆一下摩尔斯电码的基本原理。摩尔斯电码使用点和划的组合来表示字母、数字和标点符号,每个字符之间有间隔,单词之间通常用更大的间隔分隔。所以,程序需要处理输入字符串中的每个字符,并将其转换为对应的摩尔斯码。 接下来,我应该考虑如何用Python实现这个转换。用户提到的引用里有两个不同的方法,一个是使用字典存储映射关系,另一个可能涉及到字符串处理。比如引用[2]中的代码,他们用了一个字典来存储每个字符对应的摩尔斯码,然后将输入的字符串逐个字符转换,并处理大小写的问题。用户提供的示例代码可能已经涵盖了这些步骤,但需要确认是否完整。 然后,我需要检查用户提供的引用内容是否有错误或者可以改进的地方。比如,在引用[2]的代码中,摩尔斯电码中的下划线通常代表划,但标准的摩尔斯电码中划是用短横线“-”表示的,点用“.”。可能用户示例中的代码使用了不同的符号,比如用下划线代替了短横线,这需要指出,或者调整代码以符合标准表示。不过,用户提供的示例代码可能已经按照他们的需求使用了特定的符号,所以可能需要保持原样,但建议用户注意符号的选择。 此外,处理空格也是一个关键点。在摩尔斯电码中,单词之间的分隔通常是三个空格,而字符之间是一个空格。所以,在代码中需要确保单词之间的间隔正确处理。例如,如果输入句子中的空格转换为摩尔斯电码中的三个空格,或者按照引用中的处理方式,可能只用一个空格?需要检查引用中的处理方式。根据引用[2]的代码,字典中的空格键对应的值是一个空格,所以在转换时,原句中的空格会被转换为单个摩尔斯空格。这可能不符合标准,因为通常单词之间需要更大的间隔。因此,可能需要修改代码,将原句中的空格转换为三个摩尔斯空格,或者在处理时在字符之间添加分隔符。 另外,需要考虑输入中的非字母字符,比如数字或标点符号,是否被包含在字典中。引用[2]中的字典包含了数字和空格,但可能缺少标点符号。如果用户需要支持标点,可能需要扩展字典。不过用户的问题只提到英文句子,可能主要关注字母和空格的处理,但示例中的测试用例用了“I love you 1314”,包含数字,所以需要确保数字也被正确处理。 然后,代码的结构方面,可能需要将字典作为全局变量,或者作为函数内的变量。引用[2]中的代码将字典放在函数内部,这可能效率不高,但足够用于示例。此外,函数Morse_code(x)返回字典中的值,如果字符不在字典中,则返回None,这可能导致错误。所以,在转换时,需要处理未识别的字符,比如忽略它们或者抛出错误。在示例代码中,如果输入有不在字典中的字符,会返回None,可能导致结果中出现None字符串,需要处理这种情况。因此,可能需要添加错误处理,或者确保输入已经过滤了无效字符。 最后,测试代码的运行是否符合预期。例如,测试用例输入“I love you 1314”,输出是否正确。根据引用[2]中的代码,每个字母和数字都会被转换,空格转换为单个空格,但根据摩尔斯电码的标准,可能需要调整空格数量。因此,可能需要修改代码,将原句中的空格转换为三个摩尔斯空格,字符之间用一个空格分隔。例如,将输入中的空格替换为特定的分隔符。 总结步骤: 1. 创建摩尔斯电码字典,包含字母、数字和必要的符号。 2. 处理输入字符串,转换为大写,因为字典中的键是大写字母。 3. 遍历每个字符,转换为对应的摩尔斯码,处理空格为适当的分隔符。 4. 处理未识别的字符,比如忽略或报错。 5. 拼接所有转换后的摩尔斯码,字符之间用空格分隔,单词之间用三个空格分隔。 现在,根据这些思考,编写示例代码,并解释每个步骤。同时,需要指出可能的注意事项,比如符号的表示、空格处理、大小写转换等。最后生成相关问题,帮助用户进一步学习。</think>以下是使用Python实现英文句子到摩尔斯电码转换的完整方案: ### 实现步骤 1. **构建字典映射**:使用字典存储字符与摩尔斯电码的对应关系,覆盖字母、数字和基本标点 2. **预处理输入**:将输入字符串统一转为大写,处理特殊字符 3. **转换逻辑**:通过字典查询逐字符转换,字符间添加空格,单词间添加三个空格 4. **错误处理**:忽略无法识别的字符 ### Python实现代码 ```python MORSE_CODE_DICT = { 'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..', '0': '-----', '1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.', '.': '.-.-.-', ',': '--..--', '?': '..--..', "'": '.----.', '!': '-.-.--', '/': '-..-.', '(': '-.--.', ')': '-.--.-', '&': '.-...', ':': '---...', ';': '-.-.-.', '=': '-...-', '+': '.-.-.', '-': '-....-', '_': '..--.-', '"': '.-..-.', '$': '...-..-', '@': '.--.-.', ' ': ' ' # 单词分隔符 } def text_to_morse(text): """将英文文本转换为摩尔斯电码""" morse = [] for word in text.upper().split(): # 处理单词内字符 morse_word = ' '.join([MORSE_CODE_DICT.get(char, '') for char in word]) morse.append(morse_word) # 单词间用三个空格分隔 return ' '.join(morse) # 示例用法 input_text = "Hello World 2023!" output = text_to_morse(input_text) print(f"输入文本: {input_text}") print(f"摩尔斯电码: {output}") ``` ### 关键说明 1. **字典优化**:扩展支持常见标点符号,使用标准符号表示(`.`表示点,`-`表示划)[^3] 2. **单词处理**:通过`split()`自动处理连续空格,保持单词间三个空格分隔 3. **错误处理**:`get(char, '')`自动忽略字典未定义的字符 4. **大小写转换**:`.upper()`确保兼容大小写输入 ### 测试用例 输入: ``` Hello Python 3.11! ``` 输出: ``` .... . .-.. .-.. --- .--. -.-- - .... --- -. ...-- .-.-.- .---- .---- -.-.-- ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值