Spring Boot中GET请求下String转PersonDTO的映射方法问询
嘿,我来帮你搞定这个GET请求下JSON转DTO的问题!因为GET请求不像POST那样能让Spring自动把请求体里的JSON绑定到DTO对象,所以得手动做序列化转换,这里有两种实用的方案:
方案一:用Jackson的ObjectMapper(最直接,Spring默认集成)
首先先修正下你的PersonDTO类——Java里没有Int类型,得用Integer,另外Jackson需要无参构造函数,还有getter/setter(或者用Lombok简化):
import java.util.List; // 要是用Lombok的话,加个@Data注解就不用写getter、setter和构造函数了 public class PersonDTO { private Integer rcode; private List<Integer> ecode; // 必须的无参构造函数 public PersonDTO() {} // 手动写getter和setter,或者用Lombok替代 public Integer getRcode() { return rcode; } public void setRcode(Integer rcode) { this.rcode = rcode; } public List<Integer> getEcode() { return ecode; } public void setEcode(List<Integer> ecode) { this.ecode = ecode; } }
然后在你的控制器里注入Spring已经配置好的ObjectMapper,用它把JSON字符串转成PersonDTO:
import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.util.List; @RestController public class PersonController { private final ObjectMapper objectMapper; // 构造注入ObjectMapper,Spring已经帮我们配置好了实例 public PersonController(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @RequestMapping("/getPersonDTOList") public List<PersonDTO> getPersonDTOList(@RequestParam(value = "personDTO") String personDTOJson) { try { // 核心步骤:把JSON字符串转成PersonDTO对象 PersonDTO personDTO = objectMapper.readValue(personDTOJson, PersonDTO.class); // 这里根据你的需求返回列表,比如把这个DTO放到List里返回 return List.of(personDTO); } catch (IOException e) { // 处理JSON解析失败的情况,比如抛出自定义异常或者返回错误响应 throw new IllegalArgumentException("传入的personDTO参数不是合法的JSON格式", e); } } }
方案二:自定义Converter(适合全局需要这类转换的场景)
如果你的项目里多处需要把JSON字符串转成特定DTO,可以自定义一个Converter<String, PersonDTO>,注册到Spring的ConversionService里,这样就能在控制器方法里直接把参数声明为PersonDTO,不用手动转换:
- 先写自定义转换器:
import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; import java.io.IOException; @Component public class StringToPersonDTOConverter implements Converter<String, PersonDTO> { private final ObjectMapper objectMapper; public StringToPersonDTOConverter(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Override public PersonDTO convert(String source) { try { return objectMapper.readValue(source, PersonDTO.class); } catch (IOException e) { throw new IllegalArgumentException("无法将字符串转换为PersonDTO", e); } } }
- 然后控制器方法就可以简化成这样:
@RequestMapping("/getPersonDTOList") public List<PersonDTO> getPersonDTOList(@RequestParam(value = "personDTO") PersonDTO personDTO) { // 直接使用personDTO即可,Spring会自动调用转换器完成转换 return List.of(personDTO); }
注意事项
- 传递JSON字符串的时候一定要做URL编码!因为JSON里的
{、}、"这些特殊字符在URL里会被解析成非法字符,前端或者客户端传递时要把JSON字符串编码后再发送,比如用JavaScript的encodeURIComponent(),Postman这类工具会自动帮你处理编码。 - 确保DTO的字段名和JSON里的键完全匹配,如果不一样,可以用
@JsonProperty注解指定映射关系,比如@JsonProperty("rcode") private Integer responseCode;。
内容的提问来源于stack exchange,提问作者user630209
相关产品推荐
相关产品推荐

