Jackson - Wrap POJO in metadata wrapper class - It turns out stuck in an infinite loop

I have a model class that I want to wrap for a REST service for output.

public class Model {
    private String name;
    // getter..setter;
}

public class Wrapper {
    private Model model;
    private Date modifiedDate;
    // getter..setter;
}

public class Converter extends StdConverter<Model, Wrapper> {
    @Override
    public Wrapper convert(Model model) {
        return new Wrapper(model, new Date());
    }
}

When the output is json along the lines

{
  "model": {
     "name" : "dave"
  },
  "date": "tuesday"
}

The problem is that it is stuck in a loop. Constantly trying to serialize the model nested inside it.

I tried adding @JsonSerialize(converter = Converter.class) and installing module.addSerializer(Model.class, new StdDelegatingSerializer(new Converter()));in my mapper object, but get the same results every time.

Using jackson 2.8.5

+4
source share
2 answers

You can create a proxy server Modeland use it to create Wrapper. This way you can prevent the loop.

public class Converter extends StdConverter<Model, Wrapper> {

    @Override
    public Wrapper convert(Model model) {
        return new Wrapper(new ModelProxy(model), new Date());
    }
}

ModelProxy implementation:

public class ModelProxy {

    private final Model model;

    public ModelProxy(final Model model) {
        this.model = model;
    }

    public String getName() {
        return model.getName();
    }

}
+3

@nielle85 , .

ModelProxy Model , . , , , .

:

@JsonSerialize(converter = ModelConverter.class)
public class Model {
   // Getters, setters and fields omitted.
}

@JsonSerialize(converter = Converter.None.class)
public class ModelProxy extends Model {
    public ModelProxy(Model model) {
        // Copy constructor
    }
}

bean -mapping, Apache Beanutils Dozer.

0

Source: https://habr.com/ru/post/1666715/


All Articles