Skip to content

Commit 2106b2e

Browse files
author
uzma
committed
[bael-6309] code for blob serialize deserialize using jackson
1 parent d4b9bf3 commit 2106b2e

File tree

6 files changed

+198
-0
lines changed

6 files changed

+198
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<artifactId>jackson-conversions-3</artifactId>
7+
<name>jackson-conversions-3</name>
8+
9+
<parent>
10+
<groupId>com.baeldung</groupId>
11+
<artifactId>jackson-modules</artifactId>
12+
<version>0.0.1-SNAPSHOT</version>
13+
</parent>
14+
15+
<dependencies>
16+
<!-- YAML -->
17+
<dependency>
18+
<groupId>com.fasterxml.jackson.dataformat</groupId>
19+
<artifactId>jackson-dataformat-yaml</artifactId>
20+
<version>${jackson.version}</version>
21+
</dependency>
22+
<!-- Allow use of LocalDate -->
23+
<dependency>
24+
<groupId>com.fasterxml.jackson.datatype</groupId>
25+
<artifactId>jackson-datatype-jsr310</artifactId>
26+
<version>${jackson.version}</version>
27+
</dependency>
28+
<!-- CSV -->
29+
<dependency>
30+
<groupId>com.fasterxml.jackson.dataformat</groupId>
31+
<artifactId>jackson-dataformat-csv</artifactId>
32+
<version>${jackson.version}</version>
33+
</dependency>
34+
<dependency>
35+
<groupId>org.mock-server</groupId>
36+
<artifactId>mockserver-netty</artifactId>
37+
<version>${mockserver-netty.version}</version>
38+
<scope>test</scope>
39+
</dependency>
40+
<dependency>
41+
<groupId>org.json</groupId>
42+
<artifactId>json</artifactId>
43+
<version>${json.version}</version>
44+
</dependency>
45+
</dependencies>
46+
47+
<build>
48+
<finalName>jackson-conversions-3</finalName>
49+
<resources>
50+
<resource>
51+
<directory>src/main/resources</directory>
52+
<filtering>true</filtering>
53+
</resource>
54+
</resources>
55+
</build>
56+
57+
<properties>
58+
<mockserver-netty.version>5.13.2</mockserver-netty.version>
59+
<json.version>20240303</json.version>
60+
</properties>
61+
62+
</project>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.baeldung.jackson.blob;
2+
import com.fasterxml.jackson.core.JsonParser;
3+
import com.fasterxml.jackson.databind.DeserializationContext;
4+
import com.fasterxml.jackson.databind.JsonDeserializer;
5+
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
6+
7+
import javax.sql.rowset.serial.SerialBlob;
8+
import java.io.IOException;
9+
import java.sql.Blob;
10+
11+
@JacksonStdImpl
12+
public class SqlBlobDeserializer extends JsonDeserializer<Blob> {
13+
@Override
14+
public Blob deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
15+
try {
16+
byte[] blobBytes = p.getBinaryValue();
17+
return new SerialBlob(blobBytes);
18+
} catch (Exception e) {
19+
throw new IOException("Failed to deserialize Blob", e);
20+
}
21+
}
22+
}
23+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.baeldung.jackson.blob;
2+
import com.fasterxml.jackson.core.JsonGenerator;
3+
import com.fasterxml.jackson.databind.JsonSerializer;
4+
import com.fasterxml.jackson.databind.SerializerProvider;
5+
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
6+
7+
import java.io.IOException;
8+
import java.sql.Blob;
9+
10+
@JacksonStdImpl
11+
public class SqlBlobSerializer extends JsonSerializer<Blob> {
12+
@Override
13+
public void serialize(Blob value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
14+
try {
15+
byte[] blobBytes = value.getBytes(1, (int) value.length());
16+
gen.writeBinary(blobBytes);
17+
} catch (Exception e) {
18+
throw new IOException("Failed to serialize Blob", e);
19+
}
20+
}
21+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.baeldung.jackson.blob;
2+
3+
import java.sql.Blob;
4+
5+
public class User {
6+
private int id;
7+
private String name;
8+
private Blob profilePicture;
9+
10+
public int getId() {
11+
return id;
12+
}
13+
14+
public void setId(int id) {
15+
this.id = id;
16+
}
17+
18+
public String getName() {
19+
return name;
20+
}
21+
22+
public void setName(String name) {
23+
this.name = name;
24+
}
25+
26+
public Blob getProfilePicture() {
27+
return profilePicture;
28+
}
29+
30+
public void setProfilePicture(Blob profilePicture) {
31+
this.profilePicture = profilePicture;
32+
}
33+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.baeldung.jackson.blob;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.fasterxml.jackson.databind.module.SimpleModule;
5+
import org.junit.jupiter.api.BeforeEach;
6+
import org.junit.jupiter.api.Test;
7+
8+
import javax.sql.rowset.serial.SerialBlob;
9+
import java.sql.Blob;
10+
11+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
12+
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
14+
public class BlobSerDeserUnitTest {
15+
16+
private ObjectMapper mapper;
17+
18+
@BeforeEach
19+
public void setUp() {
20+
this.mapper = new ObjectMapper();
21+
SimpleModule module = new SimpleModule();
22+
module.addSerializer(Blob.class, new SqlBlobSerializer());
23+
module.addDeserializer(Blob.class, new SqlBlobDeserializer());
24+
this.mapper.registerModule(module);
25+
}
26+
27+
@Test
28+
public void givenUserWithBlob_whenSerialize_thenCorrectJsonDataProduced() throws Exception {
29+
User user = new User();
30+
user.setId(1);
31+
user.setName("John Doe");
32+
33+
byte[] profilePictureData = "example data".getBytes();
34+
Blob profilePictureBlob = new SerialBlob(profilePictureData);
35+
user.setProfilePicture(profilePictureBlob);
36+
37+
String json = mapper.writeValueAsString(user);
38+
39+
String expectedJson = "{\"id\":1,\"name\":\"John Doe\",\"profilePicture\":\"ZXhhbXBsZSBkYXRh\"}";
40+
assertEquals(expectedJson, json);
41+
}
42+
43+
@Test
44+
public void givenUserJsonWithBlob_whenDeserialize_thenCorrectDataRecieved() throws Exception {
45+
46+
String json = "{\"id\":1,\"name\":\"John Doe\",\"profilePicture\":\"ZXhhbXBsZSBkYXRh\"}";
47+
48+
49+
User deserializedUser = mapper.readValue(json, User.class);
50+
assertEquals(1, deserializedUser.getId());
51+
assertEquals("John Doe", deserializedUser.getName());
52+
53+
byte[] expectedProfilePictureData = "example data".getBytes();
54+
Blob deserializedProfilePictureBlob = deserializedUser.getProfilePicture();
55+
byte[] deserializedData = deserializedProfilePictureBlob.getBytes(1, (int) deserializedProfilePictureBlob.length());
56+
assertArrayEquals(expectedProfilePictureData, deserializedData);
57+
}
58+
}

jackson-modules/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<module>jackson-annotations</module>
1919
<module>jackson-conversions</module>
2020
<module>jackson-conversions-2</module>
21+
<module>jackson-conversions-3</module>
2122
<module>jackson-core</module>
2223
<module>jackson-custom-conversions</module>
2324
<module>jackson-exceptions</module>

0 commit comments

Comments
 (0)