Skip to content

Commit db182d3

Browse files
author
Rizky M. Satrio
committed
Modify SqlBlob Serializer and Add SqlBlob Deserializer
1 parent 7025877 commit db182d3

File tree

7 files changed

+207
-37
lines changed

7 files changed

+207
-37
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/std/JdkDeserializers.java

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.fasterxml.jackson.databind.deser.std;
22

33
import java.nio.ByteBuffer;
4-
import java.util.*;
4+
import java.sql.Blob;
5+
import java.util.HashSet;
6+
import java.util.UUID;
57
import java.util.concurrent.atomic.AtomicBoolean;
68
import java.util.concurrent.atomic.AtomicInteger;
79
import java.util.concurrent.atomic.AtomicLong;
810

9-
import com.fasterxml.jackson.databind.*;
11+
import com.fasterxml.jackson.databind.JsonDeserializer;
1012

1113
/**
1214
* Container class that contains serializers for JDK types that
@@ -28,6 +30,13 @@ public class JdkDeserializers
2830
};
2931
for (Class<?> cls : types) { _classNames.add(cls.getName()); }
3032
for (Class<?> cls : FromStringDeserializer.types()) { _classNames.add(cls.getName()); }
33+
34+
try {
35+
_classNames.add(Blob.class.getName());
36+
}
37+
catch(NoClassDefFoundError e) {
38+
39+
}
3140
}
3241

3342
public static JsonDeserializer<?> find(Class<?> rawType, String clsName)
@@ -58,6 +67,15 @@ public static JsonDeserializer<?> find(Class<?> rawType, String clsName)
5867
if (rawType == Void.class) {
5968
return NullifyingDeserializer.instance;
6069
}
70+
try {
71+
if (rawType == Blob.class) {
72+
return new SqlBlobDeserializer();
73+
}
74+
}
75+
catch(NoClassDefFoundError e) {
76+
77+
}
78+
6179
}
6280
return null;
6381
}
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/ser/std/SqlBlobSerializer.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,14 @@
1717
@JacksonStdImpl
1818
@SuppressWarnings("serial")
1919
public class SqlBlobSerializer
20-
extends JsonSerializer<Blob>
20+
extends StdScalarSerializer<Blob>
2121
{
22+
23+
public SqlBlobSerializer() {
24+
super(Blob.class);
25+
}
26+
27+
2228

2329
@Override
2430
public void serialize(Blob value, JsonGenerator gen,
@@ -28,8 +34,8 @@ public void serialize(Blob value, JsonGenerator gen,
2834
try {
2935
int bLength = (int) value.length();
3036
byte[] blob1 = value.getBytes(1, bLength);
31-
32-
gen.writeString(Base64.getEncoder().encodeToString(blob1));
37+
gen.writeBinary(blob1);
38+
// gen.writeString(Base64.getEncoder().encodeToString(blob1));
3339

3440

3541
}

src/main/java/com/fasterxml/jackson/databind/ser/std/StdJdkSerializers.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,17 @@ public static Collection<Map.Entry<Class<?>, Object>> all()
6464
sers.put(Void.class, NullSerializer.instance);
6565
sers.put(Void.TYPE, NullSerializer.instance);
6666

67-
//And Sql Blob
68-
sers.put(Blob.class, new SqlBlobSerializer());
69-
sers.put(SerialBlob.class, SqlBlobSerializer.class);
67+
7068

7169
// 09-Jan-2015, tatu: As per [databind#1073], let's try to guard against possibility
7270
// of some environments missing `java.sql.` types
7371
try {
7472
// note: timestamps are very similar to java.util.Date, thus serialized as such
7573
sers.put(java.sql.Timestamp.class, DateSerializer.instance);
74+
75+
//for Sql Blob
76+
sers.put(Blob.class, SqlBlobSerializer.class);
77+
sers.put(SerialBlob.class, SqlBlobSerializer.class);
7678

7779
// leave some of less commonly used ones as lazy, no point in proactive construction
7880
sers.put(java.sql.Date.class, SqlDateSerializer.class);
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+
}

src/test/java/com/fasterxml/jackson/databind/ser/TestJsonSerialize3.java

+2-29
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,7 @@ static class MyObject {
3535
List<String> list;
3636
}
3737

38-
static class BlobObject {
39-
// @JsonSerialize(using=SqlBlobSerializer.class)
40-
Blob sqlBlob1;
41-
42-
public Blob getSqlBlob1() {
43-
return sqlBlob1;
44-
}
45-
46-
public void setSqlBlob1(Blob sqlBlob1) {
47-
this.sqlBlob1 = sqlBlob1;
48-
}
49-
50-
51-
}
52-
38+
5339
/*
5440
/**********************************************************
5541
/* Test methods
@@ -66,20 +52,7 @@ public void testCustomContentSerializer() throws Exception
6652
}
6753

6854

69-
public void testSqlBlobSerializer() throws Exception {
70-
ObjectMapper m = new ObjectMapper();
71-
String testWord="TestObject1";
72-
SerialBlob blob1=new SerialBlob(testWord.getBytes());
73-
String base64Blob=Base64.getEncoder().encodeToString(testWord.getBytes());
74-
75-
BlobObject obj1=new BlobObject();
76-
obj1.sqlBlob1=blob1;
77-
78-
String json=m.writeValueAsString(obj1);
79-
assertEquals("{\"sqlBlob1\":\""+base64Blob+"\"}", json);
80-
81-
82-
}
55+
8356

8457

8558
}

0 commit comments

Comments
 (0)