Skip to content

Commit ce2b38a

Browse files
rsatrioRizky M. Satrio
and
Rizky M. Satrio
authored
Add serializer/deserializer for SqlBlob (#2925)
Co-authored-by: Rizky M. Satrio <[email protected]>
1 parent 7d567cf commit ce2b38a

File tree

5 files changed

+247
-3
lines changed

5 files changed

+247
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.fasterxml.jackson.databind.deser.std;
2+
3+
import java.io.IOException;
4+
import java.sql.Blob;
5+
import java.util.Arrays;
6+
import java.util.UUID;
7+
8+
import javax.sql.rowset.serial.SerialBlob;
9+
10+
import com.fasterxml.jackson.core.Base64Variants;
11+
import com.fasterxml.jackson.databind.DeserializationContext;
12+
import com.fasterxml.jackson.databind.JsonMappingException;
13+
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
14+
15+
16+
/*
17+
* Deserializer from base64 string to {@link java.sql.Blob}
18+
*/
19+
20+
public class SqlBlobDeserializer extends FromStringDeserializer<Blob>
21+
{
22+
private static final long serialVersionUID = 1L;
23+
24+
25+
public SqlBlobDeserializer() { super(Blob.class); }
26+
27+
@Override
28+
public Object getEmptyValue(DeserializationContext ctxt) {
29+
30+
return null;
31+
}
32+
33+
@Override
34+
protected Blob _deserialize(String data, DeserializationContext ctxt) throws IOException
35+
{
36+
try {
37+
return new SerialBlob(ctxt.getBase64Variant().decode(data));
38+
}
39+
catch(Exception e) {
40+
throw new JsonMappingException("Failed to Decode the Base64 String into Blob");
41+
}
42+
43+
}
44+
45+
// @Override
46+
// protected Blob _deserializeEmbedded(Object ob, DeserializationContext ctxt) throws IOException
47+
// {
48+
// if (ob instanceof byte[]) {
49+
// return _fromBytes((byte[]) ob, ctxt);
50+
// }
51+
// return super._deserializeEmbedded(ob, ctxt);
52+
// }
53+
54+
}

src/main/java/com/fasterxml/jackson/databind/ext/OptionalHandlerFactory.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
import java.util.HashMap;
44
import java.util.Map;
55

6-
import com.fasterxml.jackson.databind.*;
6+
import com.fasterxml.jackson.databind.BeanDescription;
7+
import com.fasterxml.jackson.databind.DeserializationConfig;
8+
import com.fasterxml.jackson.databind.JavaType;
9+
import com.fasterxml.jackson.databind.JsonDeserializer;
10+
import com.fasterxml.jackson.databind.JsonMappingException;
11+
import com.fasterxml.jackson.databind.JsonSerializer;
12+
import com.fasterxml.jackson.databind.SerializationConfig;
713
import com.fasterxml.jackson.databind.deser.Deserializers;
814
import com.fasterxml.jackson.databind.ser.Serializers;
915
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
10-
import com.fasterxml.jackson.databind.ser.std.SqlDateSerializer;
11-
import com.fasterxml.jackson.databind.ser.std.SqlTimeSerializer;
1216
import com.fasterxml.jackson.databind.util.ClassUtil;
1317

1418
/**
@@ -88,13 +92,18 @@ public class OptionalHandlerFactory implements java.io.Serializable
8892
private final static String CLS_NAME_JAVA_SQL_TIMESTAMP = "java.sql.Timestamp";
8993
private final static String CLS_NAME_JAVA_SQL_DATE = "java.sql.Date";
9094
private final static String CLS_NAME_JAVA_SQL_TIME = "java.sql.Time";
95+
private final static String CLS_NAME_JAVA_SQL_BLOB = "java.sql.Blob";
96+
private final static String CLS_NAME_JAVA_SQL_SERIALBLOB = "javax.sql.rowset.serial.SerialBlob";
97+
9198

9299
protected OptionalHandlerFactory() {
93100
_sqlDeserializers = new HashMap<>();
94101
_sqlDeserializers.put(CLS_NAME_JAVA_SQL_DATE,
95102
"com.fasterxml.jackson.databind.deser.std.DateDeserializers$SqlDateDeserializer");
96103
_sqlDeserializers.put(CLS_NAME_JAVA_SQL_TIMESTAMP,
97104
"com.fasterxml.jackson.databind.deser.std.DateDeserializers$TimestampDeserializer");
105+
_sqlDeserializers.put(CLS_NAME_JAVA_SQL_BLOB,
106+
"com.fasterxml.jackson.databind.deser.std.SqlBlobDeserializer");
98107

99108
_sqlSerializers = new HashMap<>();
100109
// 09-Jan-2015, tatu: As per [databind#1073], let's try to guard against possibility
@@ -104,6 +113,8 @@ protected OptionalHandlerFactory() {
104113
_sqlSerializers.put(CLS_NAME_JAVA_SQL_TIMESTAMP, DateSerializer.instance);
105114
_sqlSerializers.put(CLS_NAME_JAVA_SQL_DATE, "com.fasterxml.jackson.databind.ser.std.SqlDateSerializer");
106115
_sqlSerializers.put(CLS_NAME_JAVA_SQL_TIME, "com.fasterxml.jackson.databind.ser.std.SqlTimeSerializer");
116+
_sqlSerializers.put(CLS_NAME_JAVA_SQL_BLOB, "com.fasterxml.jackson.databind.ser.std.SqlBlobSerializer");
117+
_sqlSerializers.put(CLS_NAME_JAVA_SQL_SERIALBLOB, "com.fasterxml.jackson.databind.ser.std.SqlBlobSerializer");
107118
}
108119

109120
/*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.fasterxml.jackson.databind.ser.std;
2+
3+
import java.io.IOException;
4+
import java.sql.Blob;
5+
import java.util.Base64;
6+
7+
import com.fasterxml.jackson.core.JsonGenerator;
8+
import com.fasterxml.jackson.databind.JsonMappingException;
9+
import com.fasterxml.jackson.databind.JsonSerializer;
10+
import com.fasterxml.jackson.databind.SerializerProvider;
11+
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
12+
13+
/**
14+
* This is serializer for {@link java.sql.Blob} into base64 String
15+
*/
16+
17+
@JacksonStdImpl
18+
@SuppressWarnings("serial")
19+
public class SqlBlobSerializer
20+
extends StdScalarSerializer<Blob>
21+
{
22+
23+
public SqlBlobSerializer() {
24+
super(Blob.class);
25+
}
26+
27+
28+
29+
@Override
30+
public void serialize(Blob value, JsonGenerator gen,
31+
SerializerProvider serializers) throws IOException {
32+
// TODO Auto-generated method stub
33+
34+
try {
35+
int bLength = (int) value.length();
36+
byte[] blob1 = value.getBytes(1, bLength);
37+
gen.writeBinary(blob1);
38+
// gen.writeString(Base64.getEncoder().encodeToString(blob1));
39+
40+
41+
}
42+
catch(Exception e) {
43+
44+
throw new JsonMappingException("Failed to serialize Blob into Base64 String");
45+
}
46+
47+
48+
}
49+
50+
@Override
51+
public boolean isEmpty(SerializerProvider provider, Blob value) {
52+
return value==null;
53+
}
54+
55+
// @Override
56+
// public Class<Blob> handledType() {
57+
//
58+
// return Blob.class;
59+
// }
60+
61+
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.fasterxml.jackson.databind.ext;
2+
3+
import java.sql.Blob;
4+
5+
import javax.sql.rowset.serial.SerialBlob;
6+
7+
import com.fasterxml.jackson.core.Base64Variants;
8+
import com.fasterxml.jackson.databind.BaseMapTest;
9+
import com.fasterxml.jackson.databind.ObjectMapper;
10+
11+
// Tests for `java.sql.Date`, `java.sql.Time` and `java.sql.Timestamp`
12+
public class SqlBlobDeserializationTest extends BaseMapTest
13+
{
14+
static class BlobObject {
15+
Blob sqlBlob1;
16+
17+
public Blob getSqlBlob1() {
18+
return sqlBlob1;
19+
}
20+
21+
public void setSqlBlob1(Blob sqlBlob1) {
22+
this.sqlBlob1 = sqlBlob1;
23+
}
24+
25+
26+
}
27+
28+
/*
29+
/**********************************************************
30+
/* Test methods
31+
/**********************************************************
32+
*/
33+
34+
private final ObjectMapper m = new ObjectMapper();
35+
public void testSqlBlobDeserializer() throws Exception {
36+
37+
String testWord="TestObject1";
38+
String base64Blob=Base64Variants.getDefaultVariant().encode(testWord.getBytes());
39+
40+
String json=m.writeValueAsString(base64Blob);
41+
Blob obj2=m.readValue(json, Blob.class);
42+
String result=new String(
43+
obj2.getBytes(1L, (int)obj2.length()));
44+
assertEquals(result, testWord);
45+
46+
47+
}
48+
public void testSqlBlobDeserializer2() throws Exception {
49+
50+
String testWord="TestObject1";
51+
SerialBlob blob1=new SerialBlob(testWord.getBytes());
52+
53+
BlobObject obj1=new BlobObject();
54+
obj1.sqlBlob1=blob1;
55+
56+
String json=m.writeValueAsString(obj1);
57+
BlobObject obj2=m.readValue(json, BlobObject.class);
58+
String result=new String(
59+
obj2.getSqlBlob1().getBytes(1L, (int)obj2.getSqlBlob1().length()));
60+
assertEquals(result, testWord);
61+
62+
63+
}
64+
65+
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.fasterxml.jackson.databind.ext;
2+
3+
import java.sql.Blob;
4+
import java.util.Base64;
5+
6+
import javax.sql.rowset.serial.SerialBlob;
7+
8+
import com.fasterxml.jackson.core.Base64Variant;
9+
import com.fasterxml.jackson.core.Base64Variants;
10+
import com.fasterxml.jackson.databind.BaseMapTest;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
12+
13+
// Tests for `java.sql.Date`, `java.sql.Time` and `java.sql.Timestamp`
14+
public class SqlBlobSerializationTest extends BaseMapTest
15+
{
16+
static class BlobObject {
17+
// @JsonSerialize(using=SqlBlobSerializer.class)
18+
Blob sqlBlob1;
19+
20+
public Blob getSqlBlob1() {
21+
return sqlBlob1;
22+
}
23+
24+
public void setSqlBlob1(Blob sqlBlob1) {
25+
this.sqlBlob1 = sqlBlob1;
26+
}
27+
28+
29+
}
30+
31+
/*
32+
/**********************************************************
33+
/* Test methods
34+
/**********************************************************
35+
*/
36+
public void testSqlBlobSerializer() throws Exception {
37+
ObjectMapper m = new ObjectMapper();
38+
String testWord="TestObject1";
39+
SerialBlob blob1=new SerialBlob(testWord.getBytes());
40+
String base64Blob=Base64Variants.getDefaultVariant().encode(testWord.getBytes());
41+
42+
43+
BlobObject obj1=new BlobObject();
44+
obj1.sqlBlob1=blob1;
45+
46+
String json=m.writeValueAsString(obj1);
47+
assertEquals("{\"sqlBlob1\":\""+base64Blob+"\"}", json);
48+
49+
50+
}
51+
}

0 commit comments

Comments
 (0)