You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,不用手动转换:

  1. 先写自定义转换器:
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);
        }
    }
}
  1. 然后控制器方法就可以简化成这样:
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:44:15