两技术咨询:Jackson动态JsonProperty反序列化与REST替代EJB3Factory重构
问题2:重构Request类适配REST替代EJB3Factory
先看你的Request类,有几个需要调整的地方才能更好适配REST场景(尤其是Jackson的序列化/反序列化),我一步步给你梳理:
1. 修正泛型定义,让类更规范
你的原类里List<? extends someObject> list和构造方法的List<T> list泛型不匹配,建议把Request改成泛型类,这样能明确约束list的类型:
// 把Request定义为泛型类,T限定为someObject的子类 public class Request<T extends someObject> { public String name; public String id; public List<T> list; // 保留默认构造方法!大多数REST框架(比如Spring MVC)默认用无参构造实例化对象 public Request() {} // 修正泛型参数,和类的泛型保持一致 public Request(String name, String id, List<T> list) { this.name = name; this.id = id; this.list = list; } }
2. REST接口中处理泛型Request的注意事项
由于Java的类型擦除,Jackson需要明确知道泛型参数的具体类型才能正确反序列化。
如果是用RestTemplate调用外部REST接口:
// 用ParameterizedTypeReference指定具体的泛型类型 Request<ConcreteSomeObject> requestBody = new Request<>("test", "123", Arrays.asList(new ConcreteSomeObject())); Request<ConcreteSomeObject> response = restTemplate.postForObject( "http://your-api/endpoint", requestBody, new ParameterizedTypeReference<Request<ConcreteSomeObject>>() {} );
如果是作为Controller的请求参数:
直接在方法参数里声明具体的泛型类型即可:
@PostMapping("/api/handle-request") public ResponseEntity<String> handleRequest(@RequestBody Request<ConcreteSomeObject> request) { // 这里request的list已经是ConcreteSomeObject的实例列表,可以直接处理 return ResponseEntity.ok("processed"); }
3. 让Jackson支持有参构造(可选)
如果不想依赖无参构造+setter,想让Jackson直接用有参构造实例化,可以给构造方法加上注解:
public class Request<T extends someObject> { public String name; public String id; public List<T> list; public Request() {} // @JsonCreator告诉Jackson用这个构造方法,@JsonProperty指定参数对应JSON的字段名 @JsonCreator public Request( @JsonProperty("name") String name, @JsonProperty("id") String id, @JsonProperty("list") List<T> list ) { this.name = name; this.id = id; this.list = list; } }
4. 多态类型处理(如果someObject是抽象类/接口)
如果someObject是抽象类或者接口,Jackson需要知道如何反序列化成具体的实现类。给someObject加上多态注解:
// 告诉Jackson通过"type"字段识别具体类型 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") // 列出所有可能的子类 @JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteObject1.class, name = "obj1"), @JsonSubTypes.Type(value = ConcreteObject2.class, name = "obj2") }) public abstract class someObject { // 共同属性和方法 }
这样JSON数据里只要包含"type": "obj1",Jackson就会自动把这个对象反序列化成ConcreteObject1实例。
内容的提问来源于stack exchange,提问作者EviL GaMer
相关产品推荐
相关产品推荐

