Ich bin im Wesentlichen auf der Suche nach einer Anmerkung vom Typ "@Ignore", mit der ich verhindern kann, dass ein bestimmtes Feld persistiert wird. Wie kann dies erreicht werden?
Antworten
Zu viele Anzeigen?Um die obigen Antworten zu vervollständigen, hatte ich den Fall, dass ich eine XML-Zuordnungsdatei verwendete, in der weder die @Transient
noch transient
funktionierte... Ich musste die vorübergehenden Informationen in die Xml-Datei eingeben:
<attributes>
(...)
<transient name="field" />
</attributes>
Keine der oben genannten Antworten funktionierte bei mir mit Hibernate 5.2.10, Jersey 2.25.1 und Jackson 2.8.9. Ich habe schließlich die Antwort gefunden (sozusagen, sie verweisen auf hibernate4module, aber es funktioniert auch für 5) aquí . Keine der Json-Anmerkungen funktionierte überhaupt mit @Transient
. Offensichtlich ist Jackson2 "schlau" genug, um Dinge zu ignorieren, die mit @Transient
es sei denn, Sie sagen ausdrücklich, dass sie es nicht tun sollen. Der Schlüssel dazu war das Hinzufügen des hibernate5-Moduls (das ich für andere Hibernate-Annotationen verwendete) und das Deaktivieren der USE_TRANSIENT_ANNOTATION
Funktion in meiner Jersey-Anwendung:
ObjectMapper jacksonObjectMapper = new ObjectMapper();
Hibernate5Module jacksonHibernateModule = new Hibernate5Module();
jacksonHibernateModule.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
jacksonObjectMapper.registerModule(jacksonHibernateModule);
Hier ist die Abhängigkeit für das Hibernate5Modul:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.8.9</version>
</dependency>
Offenbar wird @Transient bei Verwendung des Hibernate5Moduls nicht serialisiert, wenn ObjectMapper verwendet wird. Durch das Entfernen wird es funktionieren.
import javax.persistence.Transient;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TransientFieldTest {
@Test
public void Print_Json() throws JsonProcessingException {
ObjectMapper objectEntityMapper = new ObjectMapper();
//objectEntityMapper.registerModule(new Hibernate5Module());
objectEntityMapper.setSerializationInclusion(Include.NON_NULL);
log.info("object: {}", objectEntityMapper.writeValueAsString( //
SampleTransient.builder()
.id("id")
.transientField("transientField")
.build()));
}
@Getter
@Setter
@Builder
private static class SampleTransient {
private String id;
@Transient
private String transientField;
private String nullField;
}
}
- See previous answers
- Weitere Antworten anzeigen