Wenn Sie die Klasse des Domänenobjekts nicht ändern können, können Sie Ihren JSON mit "virtuellen" Feldern mit einem Mix-In anreichern.
Zum Beispiel könnten Sie eine Klasse erstellen namens UserMixin
, die die firstName
und lastName
Felder versteckt und macht ein virtuelles fullName
Feld:
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonAppend;
import java.util.Date;
@JsonAppend(
prepend = true,
props = {
@JsonAppend.Prop(name = "fullName", value = UserFullName.class)
})
public abstract class UserMixin
{
@JsonIgnore
public abstract String getFirstName();
@JsonIgnore
public abstract String getLastName();
public abstract Date getCreatedDate();
}
Dann würden Sie eine Klasse implementieren UserFullName
benannt, VirtualBeanPropertyWriter
erstreckt sich die zur Verfügung zu stellen Wert des virtuellen Felds:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.cfg.MapperConfig;
import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
import com.fasterxml.jackson.databind.ser.VirtualBeanPropertyWriter;
import com.fasterxml.jackson.databind.util.Annotations;
public class UserFullName extends VirtualBeanPropertyWriter
{
public UserFullName() {}
public UserFullName(BeanPropertyDefinition propDef, Annotations contextAnnotations, JavaType declaredType)
{
super(propDef, contextAnnotations, declaredType);
}
@Override
protected Object value(Object bean, JsonGenerator gen, SerializerProvider prov) throws Exception
{
return ((User) bean).getFirstName() + " " + ((User) bean).getLastName();
}
@Override
public VirtualBeanPropertyWriter withConfig(MapperConfig<?> config, AnnotatedClass declaringClass, BeanPropertyDefinition propDef, JavaType type)
{
return new UserFullName(propDef, null, type);
}
}
Schließlich müssen Sie Ihren Mix mit dem ObjectMapper registrieren wie in der folgenden JUnit-Test gezeigt:
@Test
public void testUserFullName() throws IOException
{
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(User.class, UserMixin.class);
System.out.println(objectMapper.writeValueAsString(new User("Frodo", "Baggins")));
}
Der Ausgang ist dann:
{"fullName":"Frodo Baggins","createdDate":1485036953535}
So 'UserViewA 'kann nicht von' User' erben? In diesem Fall würde ich sagen, AOP ist Ihre beste Wette. – kaqqao
@kaqqao 'UserViewA' kann von' User' erben, aber ich kann 'User' nicht erweitern/modifizieren. – kromit