使用jackson和spring boot添加自定义对象映射器

时间:2017-02-08 20:44:18

标签: java spring spring-boot jackson

我希望能够将请求中的通用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对象。我在反序列化器中设置了一个断点,甚至看不到它被调用。

0 个答案:

没有答案