Предположим, у вас ниже POJO
модель:
class Car {
}
class Lamborghini extends Car {
}
class Ferrari extends Car {
}
Ваш класс Manager
выглядит следующим образом:
class Manager<T extends Car> {
private Class<T> clazz;
public Manager(Class<T> clazz) {
this.clazz = clazz;
}
public String generateCustomCarName() {
if (Lamborghini.class == clazz) {
return "Lambooooo!";
} else if (Ferrari.class == clazz) {
return "Wild horse Ferrari!";
}
return "Not for everyone!";
}
@Override
public String toString() {
return String.format("Manager[clazz=%s]", clazz.getName());
}
}
Теперь давайте создадим Store
, который имеетодин Ferrari
и один Lamborghini
:
class Store {
private Car ferrari = new Ferrari();
private Car lamborghini = new Lamborghini();
public Car getFerrari() {
return ferrari;
}
public void setFerrari(Car ferrari) {
this.ferrari = ferrari;
}
public Car getLamborghini() {
return lamborghini;
}
public void setLamborghini(Car lamborghini) {
this.lamborghini = lamborghini;
}
}
Теперь нам нужно иметь class
информацию во время выполнения.Из-за Java
типа Erasure нам необходимо предоставить class
:
class CustomCarSerializer<T extends Car> extends StdSerializer<T> {
public CustomCarSerializer(Class<T> clazz) {
super(clazz);
}
@Override
public void serialize(T value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
Manager<T> manager = new Manager<>(_handledType);
jgen.writeString(manager.generateCustomCarName());
}
}
Обратите внимание, что StdSerializer
также имеет конструктор, которому требуется class
, и мы можем прочитать егопозже используя _handledType
.Сейчас нам нужно сконфигурировать наши реализации с сериализаторами, используя SimpleModule
:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
public class Cars {
public static void main(String[] args) throws Exception {
SimpleModule carsModule = new SimpleModule("CarsModule");
carsModule.addSerializer(Lamborghini.class, new CustomCarSerializer<>(Lamborghini.class));
carsModule.addSerializer(Ferrari.class, new CustomCarSerializer<>(Ferrari.class));
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(carsModule);
mapper.enable(SerializationFeature.INDENT_OUTPUT);
System.out.println(mapper.writeValueAsString(new Store()));
}
}
Над отпечатками кода:
{
"ferrari" : "Wild horse Ferrari!",
"lamborghini" : "Lambooooo!"
}