springboot RedisTemplate 提示没有双引号序列化失败问题

 /**
     * retemplate相关配置
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 配置连接工厂
        template.setConnectionFactory(factory);

        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonSeial.setObjectMapper(om);

        // 值采用json序列化
        template.setValueSerializer(jacksonSeial);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());

        // 设置hash key 和value序列化模式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(jacksonSeial);
        template.afterPropertiesSet();

        return template;
    }

换成

	@Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(stringRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(stringRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

记录:springboot 集成redis后,取值提示没有设置引号问题

<think>嗯,我现在需要解决用户的问题——Spring Boot接口参数出现两个双引号的情况。首先,我得仔细分析用户提供的引用内容,看看里面提到的原因和解决方案。 根据引用[1],问题主要出现在返回的字符串是JSON格式,但被MappingJackson2HttpMessageConverter处理了,导致添加了额外的双引号。例如,返回"ABC"变成了"\"ABC\"",最后显示为"ABC"。解决方案部分用户没有看到具体的,但可能需要更换消息转换器或者配置生产商。 引用[2]提到在Spring WebFlux中,@RequestBody接收的字符串参数出现双引号问题,可能与HttpMessageConverter配置冲突有关,特别是同存在Jackson和FastJSON。用户在Controller方法中断点调试,发现传入的body已经被添加了双引号。 引用[3]是关于YAML配置的,可能用户提到外部配置,但和双引号问题关联大。引用[4]比较Groovy和Scala,似乎相关。所以主要关注前两个引用。 接下来,我需要整理常见的解决方案。根据引用[1]和[2],根本原因是消息转换器配置当。可能的解决方法包括: 1. 更换消息转换器的顺序,优先使用StringHttpMessageConverter处理字符串类型。 2. 强制指定produces为text/plain,避免使用application/json。 3. 在WebFlux中,可能需要在@RequestBody参数上使用map操作来移除双引号,但这可能治标治本。 4. 排查是否多个JSON库冲突,比如同存在Jackson和Fastjson,移除其中一个或统一配置。 另外,用户提到的是接口参数出现双引号,也就是请求中的@RequestBody接收到的字符串多了双引号,而是响应的问题。这候需要看接收参数的配置。例如,在WebFlux中,@RequestBody Mono<String> body接收到的字符串可能被Jackson解析加了双引号,因此需要检查传入的Content-Type是否正确(比如是否为application/json),或者是否正确配置了消息转换器。 可能的解决方案步骤: 1. 检查依赖,排除必要的JSON库,比如如果只用Jackson,就移除Fastjson。 2. 在Controller方法中明确指定consumes为text/plain,确保接收字符串经过JSON解析。 3. 自定义消息转换器,将StringHttpMessageConverter放在第一位,优先处理text/plain类型。 如果用户使用的是Spring MVC,可以通过配置HttpMessageConverters调整顺序。而在WebFlux中,可能需要通过配置Encoder和Decoder来实现。 总结解决方案如下: 1. 调整消息转换器顺序,确保StringHttpMessageConverter优先处理String类型。 2. 指定consumes和produces为text/plain。 3. 避免多个JSON库冲突,统一使用一个。 4. 在接收参数,如果是JSON字符串,可能需要手动处理转义,但这是最佳方法。 用户可能需要根据具体场景选择解决方案,比如是请求参数的问题还是响应的问题。根据用户描述,问题出现在接口参数上,也就是请求体中的字符串被添加了双引号,因此重点在请求消息转换器的配置上。 </think>根据引用的资料分析,Spring Boot接口参数出现双引号问题的核心原因是**HTTP消息转换器配置冲突**,以下是具体解决方案: ### 🔧 根本原因 1. **JSON转换器误处理** 当参数类型为`String`,Spring默认的`MappingJackson2HttpMessageConverter`会将字符串误判为JSON对象,自动添加转义双引号[^1][^2] 2. **多JSON库冲突** 同存在Jackson和Fastjson等库,多个转换器竞争处理请求体导致双重转义[^2] 3. **Content-Type匹配** 请求头`Content-Type: application/json`强制触发JSON转换器处理非JSON数据[^1] ### ✅ 解决方案 #### 方法1:强制指定文本转换器(推荐) ```java @PostMapping(value = "/endpoint", consumes = MediaType.TEXT_PLAIN_VALUE) // 关键配置 public ResponseEntity<?> handleRequest(@RequestBody String rawBody) { // 直接获取原始字符串 rawBody 双引号 return ResponseEntity.ok().build(); } ``` #### 方法2:调整消息转换器优先级 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 将字符串转换器提到JSON转换器之前 converters.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8)); } } ``` #### 方法3:统一JSON库依赖 在`pom.xml`中排除冲突库: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </exclusion> </exclusions> </dependency> ``` #### 方法4:手动反转义(应急方案) ```java @PostMapping("/endpoint") public void processBody(@RequestBody String body) { String cleanBody = body.replaceAll("^\"|\"$", ""); // 去除首尾双引号 // 使用cleanBody处理业务 } ``` ### ⚠️ 注意事项 1. 使用Postman测试,需明确设置: - `Content-Type: text/plain` - 将请求体格式选为**raw**而非JSON 2. 检查前端代码确认未意外添加`JSON.stringify()` 3. 在WebFlux中需配置`StringDecoder`优先[^2] > 建议优先采用**方法1+方法2组合**,从消息转换机制源头解决问题。实际案例表明调整转换器顺序后双引号问题立即消失[^2]。 --- ### 📚 相关问题 1. **如何在Spring Boot中自定义HTTP消息转换器?** > 需实现`WebMvcConfigurer`接口的`configureMessageConverters`方法,通过控制`converters`列表顺序实现优先级管理,可参考方法2的实现逻辑[^2]。 2. **Jackson和Fastjson共存如何避免冲突?** > 建议在依赖中排除其中一个库(如方法3),或在配置类中用`@Primary`标注首选的转换器bean,强制指定默认JSON处理器[^2][^4]。 3. **Content-Type设置错误会导致哪些常见问题?** > 除双引号问题外,还可能引发`415 Unsupported Media Type`错误或参数绑定失败,务必确保前端Content-Type与`@RequestMapping`的consumes属性匹配[^1][^3]。 4. **WebFlux和MVC处理双引号问题的差异?** > WebFlux需通过配置`org.springframework.http.codec.Decoder`实现,而非`WebMvcConfigurer`,核心思路仍是提升文本处理器优先级[^2]。 [^1]: JSON转换器误处理字符串 [^2]: 多转换器冲突与调试方案 [^3]: Content-Type配置的重要性 [^4]: 依赖库冲突解决方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值