Я хотел создать org.eclipse.persistence.mappings.converters.Converter для преобразования POJO в JSON. Я делаю это, чтобы сохранить его в поле Postgres jsonb.
Это отлично работало с Spring Boot 1.5.14. Новый проект находится на Spring Boot 2.0.2, и код больше не работает. Преобразователь больше не вызывается, что приводит к ошибке типа в базе данных.
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.sessions.Session;
import org.postgresql.util.PGobject;
import java.io.IOException;
import java.sql.SQLException;
public class MetadataConverter implements org.eclipse.persistence.mappings.converters.Converter {
private ObjectMapper mapper = new ObjectMapper();
@Override
public Object convertObjectValueToDataValue(Object o, Session session) {
try {
PGobject out = new PGobject();
out.setType("jsonb");
out.setValue(mapper.writeValueAsString(o));
return out;
} catch (SQLException e) {
throw new IllegalArgumentException("Unable to serialize to json field ", e);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new IllegalArgumentException("Unable to serialize to json field ", e);
}
}
@Override
public Metadata convertDataValueToObjectValue(Object o, Session session) {
if (o == null) {
return null;
}
try {
if (o instanceof PGobject) {
return mapper.readValue(((PGobject) o).getValue(), new TypeReference<Metadata>(){});
} else {
return mapper.readValue((String) o, new TypeReference<Metadata>(){});
}
} catch (IOException | ClassCastException e) {
throw new IllegalArgumentException("Unable to deserialize to json field ");
}
}
@Override
public boolean isMutable() {
return false;
}
@Override
public void initialize(DatabaseMapping databaseMapping, Session session) {
}
}
и вот модель:
...
@Data
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
@Table(name = "MY_TEST")
public class TestModel implements Serializable{
@Id
String id;
@Column(columnDefinition = "jsonb")
@Converter(converterClass = MetadataConverter.class, name = "metadataJsonConverter")
@org.eclipse.persistence.annotations.Convert("metadataJsonConverter")
Metadata metadata;
}
В обоих проектах версия eclipslink - 2.6.3, версия Postgres - в старом проекте 9.4.1212.jre7 (обновление уже запланировано) и в новом проекте 42.2.2
У кого-нибудь есть идея, что изменилось?
С наилучшими пожеланиями
Lukas