我希望能够将请求中的通用Object转换为我使用Spring Boot和Jackson构建的自定义对象。
例如,假设我有以下控制器方法:
@RequestMapping(value = "/user/action", method = RequestMethod.POST)
public String processAction(@RequestBody Request theRequest){
return "Success";
}
现在Request对象如下所示:
public class Request {
public Request(){
}
private String action;
private Object actionRequest;
//getters/setters
实际的actionRequest可以是任何Object(例如布尔值,字符串或自定义构建的)。
所以说我有一个自定义构建的ActionA类:
public class ActionA {
public ActionA(){
}
private int actionAInfo;
//getters/setters
}
如果我使用POST和
的有效负载调用我的控制器{"action": "startEstimate", "actionRequest":true}
当它到达方法时,' actionRequest'已经转换为布尔值。
但是,如果我提供有效载荷
{"action": "startEstimate", "actionRequest": {"actionAInfo": 5}}
' actionRequest'刚刚转换为HashMap,其键为&action; ActionAInfo'和#5;'的价值。
如何配置Spring Boot / Jackson来创建ActionA对象?
我看到的一个解决方法是在请求中使用Object而不是Object,使用ObjectNode。然后做类似的事情
ObjectMapper om = new ObjectMapper();
ActionA actionA = om.convertValue(theRequest.getActionRequest(), ActionA.class);
但是,这不会随着我添加更多操作而扩展,因为在尝试构建之前我需要知道类型。
我也试过这里提出的解决方案 Custom JSON Deserialization with Jackson
它似乎没有用。我创建了一个新的ActionADeserializer
public class ActionADeserializer extends JsonDeserializer<ActionA> {
@Override
public ActionA deserialize(JsonParser jp, DeserializationContext ctxt) throws
IOException,
JsonProcessingException {
return jp.readValueAs(ActionA.class);
}
}
并修改了ActionA类
@JsonDeserialize(using = ActionADeserializer.class)
public class ActionA
当我提交有效载荷时
{"action": "startEstimate", "actionRequest": {"actionAInfo": 5}}
它仍然创建HashMap而不是ActionA对象。我在反序列化器中设置了一个断点,甚至看不到它被调用。