Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use newer JSON-P & JSON-B standards as alternative to Jackson, fixes #29 #112

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
34 changes: 34 additions & 0 deletions hibernate-types-52/pom.xml
Expand Up @@ -40,6 +40,36 @@
<optional>true</optional>
</dependency>

<dependency>
<groupId>javax.json.bind</groupId>
<artifactId>javax.json.bind-api</artifactId>
<version>${json.bind-api.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>${json-api.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.eclipse</groupId>
<artifactId>yasson</artifactId>
<version>${yasson.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>${glassfish.json.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
Expand Down Expand Up @@ -69,6 +99,10 @@

<mysql.version>8.0.13</mysql.version>
<jackson.version>2.9.9</jackson.version>
<json.bind-api.version>1.0</json.bind-api.version>
<json-api.version>1.1.4</json-api.version>
<yasson.version>1.0.1</yasson.version>
<glassfish.json.version>1.1.2</glassfish.json.version>

<jdk.version>8</jdk.version>
<jdk>${env.JAVA_HOME_8}</jdk>
Expand Down
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import com.vladmihalcea.hibernate.type.AbstractHibernateType;
import com.vladmihalcea.hibernate.type.json.internal.JacksonUtil;
import com.vladmihalcea.hibernate.type.json.internal.JsonBinarySqlTypeDescriptor;
import com.vladmihalcea.hibernate.type.json.internal.JsonTypeDescriptor;
import com.vladmihalcea.hibernate.type.util.Configuration;
Expand All @@ -25,14 +26,14 @@ public class JsonBinaryType extends AbstractHibernateType<Object> implements Dyn
public JsonBinaryType() {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper())
new JsonTypeDescriptor(JacksonUtil.getObjectMapperWrapper(Configuration.INSTANCE))
);
}

public JsonBinaryType(Configuration configuration) {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonTypeDescriptor(configuration.getObjectMapperWrapper()),
new JsonTypeDescriptor(JacksonUtil.getObjectMapperWrapper(configuration)),
configuration
);
}
Expand Down
Expand Up @@ -3,6 +3,7 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vladmihalcea.hibernate.type.AbstractHibernateType;
import com.vladmihalcea.hibernate.type.json.internal.JacksonUtil;
import com.vladmihalcea.hibernate.type.json.internal.JsonBinarySqlTypeDescriptor;
import com.vladmihalcea.hibernate.type.json.internal.JsonNodeTypeDescriptor;
import com.vladmihalcea.hibernate.type.util.Configuration;
Expand All @@ -23,14 +24,14 @@ public class JsonNodeBinaryType extends AbstractHibernateType<JsonNode> {
public JsonNodeBinaryType() {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonNodeTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper())
new JsonNodeTypeDescriptor(JacksonUtil.getObjectMapperWrapper(Configuration.INSTANCE))
);
}

public JsonNodeBinaryType(Configuration configuration) {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonNodeTypeDescriptor(configuration.getObjectMapperWrapper()),
new JsonNodeTypeDescriptor(JacksonUtil.getObjectMapperWrapper(configuration)),
configuration
);
}
Expand Down
Expand Up @@ -3,6 +3,7 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vladmihalcea.hibernate.type.AbstractHibernateType;
import com.vladmihalcea.hibernate.type.json.internal.JacksonUtil;
import com.vladmihalcea.hibernate.type.json.internal.JsonNodeTypeDescriptor;
import com.vladmihalcea.hibernate.type.json.internal.JsonStringSqlTypeDescriptor;
import com.vladmihalcea.hibernate.type.util.Configuration;
Expand All @@ -22,14 +23,14 @@ public class JsonNodeStringType extends AbstractHibernateType<JsonNode> {
public JsonNodeStringType() {
super(
JsonStringSqlTypeDescriptor.INSTANCE,
new JsonNodeTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper())
new JsonNodeTypeDescriptor(JacksonUtil.getObjectMapperWrapper(Configuration.INSTANCE))
);
}

public JsonNodeStringType(Configuration configuration) {
super(
JsonStringSqlTypeDescriptor.INSTANCE,
new JsonNodeTypeDescriptor(configuration.getObjectMapperWrapper()),
new JsonNodeTypeDescriptor(JacksonUtil.getObjectMapperWrapper(configuration)),
configuration
);
}
Expand Down
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import com.vladmihalcea.hibernate.type.AbstractHibernateType;
import com.vladmihalcea.hibernate.type.json.internal.JacksonUtil;
import com.vladmihalcea.hibernate.type.json.internal.JsonStringSqlTypeDescriptor;
import com.vladmihalcea.hibernate.type.json.internal.JsonTypeDescriptor;
import com.vladmihalcea.hibernate.type.util.Configuration;
Expand All @@ -25,14 +26,14 @@ public class JsonStringType extends AbstractHibernateType<Object> implements Dyn
public JsonStringType() {
super(
JsonStringSqlTypeDescriptor.INSTANCE,
new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper())
new JsonTypeDescriptor(JacksonUtil.getObjectMapperWrapper(Configuration.INSTANCE))
);
}

public JsonStringType(Configuration configuration) {
super(
JsonStringSqlTypeDescriptor.INSTANCE,
new JsonTypeDescriptor(configuration.getObjectMapperWrapper()),
new JsonTypeDescriptor(JacksonUtil.getObjectMapperWrapper(configuration)),
configuration
);
}
Expand Down
@@ -1,9 +1,15 @@
package com.vladmihalcea.hibernate.type.json.internal;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vladmihalcea.hibernate.type.util.Configuration;
import com.vladmihalcea.hibernate.type.util.JsonSerializer;
import com.vladmihalcea.hibernate.type.util.JsonSerializerSupplier;
import com.vladmihalcea.hibernate.type.util.ObjectMapperSupplier;
import com.vladmihalcea.hibernate.type.util.ObjectMapperWrapper;

import java.lang.reflect.Type;
import java.util.function.Supplier;

/**
* @author Vlad Mihalcea
Expand All @@ -29,4 +35,55 @@ public static JsonNode toJsonNode(String value) {
public static <T> T clone(T value) {
return ObjectMapperWrapper.INSTANCE.clone(value);
}

/**
* Get {@link ObjectMapperWrapper} reference
*
* @return {@link ObjectMapperWrapper} reference
*/
public static ObjectMapperWrapper getObjectMapperWrapper(Configuration configuration) {
Object objectMapperPropertyInstance = configuration.instantiateClass(Configuration.PropertyKey.JACKSON_OBJECT_MAPPER);

ObjectMapperWrapper objectMapperWrapper = new ObjectMapperWrapper();

if (objectMapperPropertyInstance != null) {
if(objectMapperPropertyInstance instanceof ObjectMapperSupplier) {
ObjectMapper objectMapper = ((ObjectMapperSupplier) objectMapperPropertyInstance).get();
if(objectMapper != null) {
objectMapperWrapper = new ObjectMapperWrapper(objectMapper);
}
}
else if (objectMapperPropertyInstance instanceof Supplier) {
Supplier<ObjectMapper> objectMapperSupplier = (Supplier<ObjectMapper>) objectMapperPropertyInstance;
objectMapperWrapper = new ObjectMapperWrapper(objectMapperSupplier.get());
}
else if (objectMapperPropertyInstance instanceof ObjectMapper) {
ObjectMapper objectMapper = (ObjectMapper) objectMapperPropertyInstance;
objectMapperWrapper = new ObjectMapperWrapper(objectMapper);
}
}

Object jsonSerializerPropertyInstance = configuration.instantiateClass(Configuration.PropertyKey.JSON_SERIALIZER);

if (jsonSerializerPropertyInstance != null) {
JsonSerializer jsonSerializer = null;

if(jsonSerializerPropertyInstance instanceof JsonSerializerSupplier) {
jsonSerializer = ((JsonSerializerSupplier) jsonSerializerPropertyInstance).get();
}
else if (jsonSerializerPropertyInstance instanceof Supplier) {
Supplier<JsonSerializer> jsonSerializerSupplier = (Supplier<JsonSerializer>) jsonSerializerPropertyInstance;
jsonSerializer = jsonSerializerSupplier.get();
}
else if (jsonSerializerPropertyInstance instanceof JsonSerializer) {
jsonSerializer = (JsonSerializer) jsonSerializerPropertyInstance;
}

if (jsonSerializer != null) {
objectMapperWrapper.setJsonSerializer(jsonSerializer);
}
}

return objectMapperWrapper;
}
}
@@ -0,0 +1,77 @@
package com.vladmihalcea.hibernate.type.jsonp;

import com.vladmihalcea.hibernate.type.AbstractHibernateType;
import com.vladmihalcea.hibernate.type.jsonp.internal.JsonBinarySqlTypeDescriptor;
import com.vladmihalcea.hibernate.type.jsonp.internal.JsonTypeDescriptor;
import com.vladmihalcea.hibernate.type.jsonp.internal.JsonbUtil;
import com.vladmihalcea.hibernate.type.util.Configuration;
import com.vladmihalcea.hibernate.type.util.JsonbWrapper;
import org.hibernate.usertype.DynamicParameterizedType;

import javax.json.bind.Jsonb;
import java.lang.reflect.Type;
import java.util.Properties;

/**
* Maps any given Java object on a JSON column type that is managed via {@link java.sql.PreparedStatement#setObject(int, Object)} at JDBC Driver level. For instance, if you are using PostgreSQL, you should be using this {@link JsonBinaryType} to map both {@code jsonb} and {@code json} column types.
* <p>
*
* @author Jan-Willem Gmelig Meyling
*/
public class JsonBinaryType extends AbstractHibernateType<Object> implements DynamicParameterizedType {

public static final JsonBinaryType INSTANCE = new JsonBinaryType();

public JsonBinaryType() {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonTypeDescriptor(JsonbUtil.getObjectMapperWrapper(Configuration.INSTANCE))
);
}

public JsonBinaryType(Configuration configuration) {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonTypeDescriptor(JsonbUtil.getObjectMapperWrapper(configuration)),
configuration
);
}

public JsonBinaryType(Jsonb objectMapper) {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonTypeDescriptor(new JsonbWrapper(objectMapper))
);
}

public JsonBinaryType(JsonbWrapper jsonbWrapper) {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonTypeDescriptor(jsonbWrapper)
);
}

public JsonBinaryType(Jsonb objectMapper, Type javaType) {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonTypeDescriptor(new JsonbWrapper(objectMapper), javaType)
);
}

public JsonBinaryType(JsonbWrapper jsonbWrapper, Type javaType) {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonTypeDescriptor(jsonbWrapper, javaType)
);
}

public String getName() {
return "jsonb-p";
}

@Override
public void setParameterValues(Properties parameters) {
((JsonTypeDescriptor) getJavaTypeDescriptor()).setParameterValues(parameters);
}

}
@@ -0,0 +1,54 @@
package com.vladmihalcea.hibernate.type.jsonp;

import com.vladmihalcea.hibernate.type.AbstractHibernateType;
import com.vladmihalcea.hibernate.type.jsonp.internal.JsonBinarySqlTypeDescriptor;
import com.vladmihalcea.hibernate.type.jsonp.internal.JsonNodeTypeDescriptor;
import com.vladmihalcea.hibernate.type.jsonp.internal.JsonbUtil;
import com.vladmihalcea.hibernate.type.util.Configuration;
import com.vladmihalcea.hibernate.type.util.JsonbWrapper;

import javax.json.JsonValue;
import javax.json.bind.Jsonb;

/**
* Maps a Json-P {@link JsonValue} object on a JSON column type that is managed via {@link java.sql.PreparedStatement#setObject(int, Object)} at JDBC Driver level. For instance, if you are using PostgreSQL, you should be using {@link JsonNodeBinaryType} to map both {@code jsonb} and {@code json} column types to a Jackson {@link JsonNode} object.
*
* @author Jan-Willem Gmelig Meyling
*/
public class JsonNodeBinaryType extends AbstractHibernateType<JsonValue> {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one is better named JsonValueBinaryType


public static final JsonNodeBinaryType INSTANCE = new JsonNodeBinaryType();

public JsonNodeBinaryType() {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonNodeTypeDescriptor(JsonbUtil.getObjectMapperWrapper(Configuration.INSTANCE))
);
}

public JsonNodeBinaryType(Configuration configuration) {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonNodeTypeDescriptor(JsonbUtil.getObjectMapperWrapper(configuration)),
configuration
);
}

public JsonNodeBinaryType(Jsonb objectMapper) {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonNodeTypeDescriptor(new JsonbWrapper(objectMapper))
);
}

public JsonNodeBinaryType(JsonbWrapper jsonbWrapper) {
super(
JsonBinarySqlTypeDescriptor.INSTANCE,
new JsonNodeTypeDescriptor(jsonbWrapper)
);
}

public String getName() {
return "jsonb-p-value";
}
}