Skip to content

Commit 3bc945a

Browse files
author
talhadilber
committed
Deserializer interface created and override system created
1 parent e10b55d commit 3bc945a

File tree

9 files changed

+123
-7
lines changed

9 files changed

+123
-7
lines changed

pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
<groupId>org.springframework</groupId>
3030
<artifactId>spring-webmvc</artifactId>
3131
</dependency>
32+
<dependency>
33+
<groupId>com.fasterxml.jackson.core</groupId>
34+
<artifactId>jackson-databind</artifactId>
35+
</dependency>
3236
<dependency>
3337
<groupId>org.springframework.boot</groupId>
3438
<artifactId>spring-boot-autoconfigure</artifactId>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.beyt.config;
2+
3+
import com.beyt.deserializer.BasicDeserializer;
4+
import com.beyt.deserializer.IDeserializer;
5+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
9+
@Configuration
10+
public class DeserializerConfig {
11+
12+
@Bean
13+
@ConditionalOnMissingBean
14+
public IDeserializer basicDeserializer() {
15+
return new BasicDeserializer();
16+
// return new JacksonDeserializer();// TODO
17+
}
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.beyt.deserializer;
2+
3+
import com.beyt.util.ReflectionUtil;
4+
5+
public class BasicDeserializer implements IDeserializer {
6+
@Override
7+
public <T> T deserialize(Object value, Class<T> clazz) throws Exception {
8+
return ReflectionUtil.deserializeObject(value.toString(), clazz);
9+
}
10+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.beyt.deserializer;
2+
3+
public interface IDeserializer {
4+
<T> T deserialize(Object value, Class<T> clazz) throws Exception;
5+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.beyt.deserializer;
2+
3+
import com.fasterxml.jackson.databind.DeserializationFeature;
4+
import com.fasterxml.jackson.databind.MapperFeature;
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import com.fasterxml.jackson.databind.json.JsonMapper;
7+
8+
public class JacksonDeserializer implements IDeserializer {
9+
10+
public static final ObjectMapper mapper;
11+
12+
static {
13+
mapper = JsonMapper.builder()
14+
.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS)
15+
.build();
16+
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
17+
}
18+
19+
@Override
20+
public <T> T deserialize(Object value, Class<T> clazz) throws Exception {
21+
if (value.getClass().isAssignableFrom(clazz)) {
22+
return (T) value;
23+
}
24+
25+
if (clazz.isEnum()) {
26+
return (T) Enum.valueOf((Class<Enum>) clazz, value.toString());
27+
}
28+
return mapper.readValue(value.toString(), clazz);
29+
}
30+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.beyt.exception;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
5+
/**
6+
* Created by tdilber at 24-Aug-19
7+
*/
8+
@Slf4j
9+
public class DynamicQueryValueSerializeException extends RuntimeException {
10+
public DynamicQueryValueSerializeException(String errorMessage) {
11+
super(errorMessage);
12+
log.error(errorMessage, this);
13+
}
14+
15+
public DynamicQueryValueSerializeException(String errorMessage, Throwable err) {
16+
super(errorMessage, err);
17+
log.error(errorMessage, err);
18+
}
19+
}

src/main/java/com/beyt/query/DynamicSpecification.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,8 @@
33
import com.beyt.dto.Criteria;
44
import com.beyt.dto.enums.CriteriaType;
55
import com.beyt.dto.enums.JoinType;
6-
import com.beyt.exception.DynamicQueryNoAvailableEnumException;
7-
import com.beyt.exception.DynamicQueryNoAvailableOperationException;
8-
import com.beyt.exception.DynamicQueryNoAvailableOrOperationUsageException;
9-
import com.beyt.exception.DynamicQueryNoAvailableParenthesesOperationUsageException;
10-
import com.beyt.util.ReflectionUtil;
6+
import com.beyt.exception.*;
7+
import com.beyt.util.ApplicationContextUtil;
118
import com.beyt.util.SpecificationUtil;
129
import org.apache.commons.lang3.tuple.ImmutableTriple;
1310
import org.apache.commons.lang3.tuple.Triple;
@@ -113,10 +110,10 @@ public static String getFieldName(String key) {
113110
return splitedKey[splitedKey.length - 1];
114111
}
115112

116-
private Predicate addPredicate(Path<?> root, CriteriaBuilder builder, Criteria criteria) {
113+
protected Predicate addPredicate(Path<?> root, CriteriaBuilder builder, Criteria criteria) {
117114
if (!criteria.operation.equals(CriteriaType.SPECIFIED)) {
118115
try {
119-
criteria.values = ReflectionUtil.convertObjectArrayToIfNotAvailable(root.get(criteria.key).getJavaType(), criteria.values);
116+
criteria.values = deserialize(root.get(criteria.key).getJavaType(), criteria.values);
120117
} catch (Exception e) {
121118
throw new DynamicQueryNoAvailableEnumException("There is a "
122119
+ root.get(criteria.key).getJavaType().getSimpleName() + " Enum Problem in Criteria Key: "
@@ -142,4 +139,20 @@ private Predicate addPredicate(Path<?> root, CriteriaBuilder builder, Criteria c
142139
joinMap.put(joinMapKey, join);
143140
return join;
144141
}
142+
143+
protected List<Object> deserialize(Class<?> clazz, List<Object> objects) throws Exception {
144+
List<Object> result = new ArrayList<>();
145+
for (Object object : objects) {
146+
Object deserialized = null;
147+
try {
148+
deserialized = ApplicationContextUtil.getDeserializer().deserialize(object.toString(), clazz);
149+
} catch (Exception e) {
150+
throw new DynamicQueryValueSerializeException("There is a "
151+
+ clazz.getSimpleName() + " Deserialization Problem in Criteria Value: "
152+
+ object.toString());
153+
}
154+
result.add(deserialized);
155+
}
156+
return result;
157+
}
145158
}

src/main/java/com/beyt/util/ApplicationContextUtil.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.beyt.util;
22

3+
import com.beyt.deserializer.IDeserializer;
34
import com.beyt.provider.IEntityManagerProvider;
45
import org.springframework.beans.BeansException;
56
import org.springframework.context.ApplicationContext;
@@ -10,11 +11,13 @@
1011
public class ApplicationContextUtil implements ApplicationContextAware {
1112
private static ApplicationContext applicationContext;
1213
private static IEntityManagerProvider entityManagerProvider;
14+
private static IDeserializer deserializer;
1315

1416
@Override
1517
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
1618
ApplicationContextUtil.applicationContext = applicationContext;
1719
ApplicationContextUtil.entityManagerProvider = applicationContext.getBean(IEntityManagerProvider.class);
20+
ApplicationContextUtil.deserializer = applicationContext.getBean(IDeserializer.class);
1821
}
1922

2023
public static ApplicationContext getApplicationContext() {
@@ -24,4 +27,8 @@ public static ApplicationContext getApplicationContext() {
2427
public static EntityManager getEntityManager(){
2528
return entityManagerProvider.provide();
2629
}
30+
31+
public static IDeserializer getDeserializer() {
32+
return deserializer;
33+
}
2734
}

src/main/java/com/beyt/util/ReflectionUtil.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.beyt.util.field.FieldUtil;
44
import lombok.extern.slf4j.Slf4j;
5+
import org.apache.commons.lang3.SerializationException;
56

67
import java.lang.reflect.Method;
78
import java.util.ArrayList;
@@ -49,4 +50,13 @@ public static List<Object> convertObjectArrayToIfNotAvailable(Class<?> clazz, Li
4950

5051
return objects;
5152
}
53+
54+
@SuppressWarnings("unchecked")
55+
public static <T> T deserializeObject(String serialized, Class<T> clazz) throws Exception {
56+
if (FieldUtil.isSupportedType(clazz)) {
57+
return (T) FieldUtil.fillValue(clazz, serialized);
58+
}
59+
60+
throw new SerializationException("Field Type: " + clazz.getName() + " not supported!");
61+
}
5262
}

0 commit comments

Comments
 (0)