我正在尝试创建一个休息终点并使用Swagger作为UI表示.我使用它的pojo有一个带注释的变量 @JsonIgnore
,如下所示.
@JsonIgnore private Mapproperty = new HashMap ();
现在,当我提供JSON
(具有属性值)到这个终点并试图读取它的值时,它就会出现null
(由于@JsonIgnore
).
pojoObj.getProperties(); //null
如果我可以在不删除@JsonIgnore
注释的情况下获得属性值,有什么办法吗?
这可以通过利用Jackson的Mixin功能来实现,您可以在其中创建另一个取消忽略注释的类.然后,您可以将mixin"附加"到ObjectMapper
运行时:
这是我用过的POJO:
public class Bean { // always deserialized public String name; // ignored (unless...) @JsonIgnore public Mapproperties = new HashMap (); }
这是"其他"课程.它只是具有相同属性名称的另一个POJO
public class DoNotIgnore { @JsonIgnore(false) public Mapproperties; }
杰克逊模块用于将bean绑定到mixin:
@SuppressWarnings("serial") public class DoNotIgnoreModule extends SimpleModule { public DoNotIgnoreModule() { super("DoNotIgnoreModule"); } @Override public void setupModule(SetupContext context) { context.setMixInAnnotations(Bean.class, DoNotIgnore.class); } }
把它们捆绑在一起:
public static void main(String[] args) { String json = "{\"name\": \"MyName\"," +"\"properties\": {\"key1\": \"val1\", \"key2\": \"val2\", \"key3\": \"val3\"}" + "}"; try { ObjectMapper mapper = new ObjectMapper(); // decide at run time whether to ignore properties or not if ("do-not-ignore".equals(args[0])) { mapper.registerModule(new DoNotIgnoreModule()); } Bean bean = mapper.readValue(json, Bean.class); System.out.println(" Name: " + bean.name + ", properties " + bean.properties); } catch (IOException e) { e.printStackTrace(); } }