Merge pull request #6298 from soufiane-cheouati/master
Custom annotations files
This commit is contained in:
		
						commit
						923029ca09
					
				| @ -0,0 +1,13 @@ | |||||||
|  | package com.baeldung.customannotations; | ||||||
|  | 
 | ||||||
|  | import static java.lang.annotation.ElementType.METHOD; | ||||||
|  | import static java.lang.annotation.RetentionPolicy.RUNTIME; | ||||||
|  | 
 | ||||||
|  | import java.lang.annotation.Retention; | ||||||
|  | import java.lang.annotation.Target; | ||||||
|  | 
 | ||||||
|  | @Retention(RUNTIME) | ||||||
|  | @Target(METHOD) | ||||||
|  | public @interface Init { | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | package com.baeldung.customannotations; | ||||||
|  | 
 | ||||||
|  | import static java.lang.annotation.ElementType.FIELD; | ||||||
|  | import static java.lang.annotation.RetentionPolicy.RUNTIME; | ||||||
|  | 
 | ||||||
|  | import java.lang.annotation.Retention; | ||||||
|  | import java.lang.annotation.Target; | ||||||
|  | 
 | ||||||
|  | @Retention(RUNTIME) | ||||||
|  | @Target({ FIELD }) | ||||||
|  | public @interface JsonElement { | ||||||
|  |     public String key() default ""; | ||||||
|  | } | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | package com.baeldung.customannotations; | ||||||
|  | 
 | ||||||
|  | import static java.lang.annotation.ElementType.TYPE; | ||||||
|  | import static java.lang.annotation.RetentionPolicy.RUNTIME; | ||||||
|  | 
 | ||||||
|  | import java.lang.annotation.Retention; | ||||||
|  | import java.lang.annotation.Target; | ||||||
|  | 
 | ||||||
|  | @Retention(RUNTIME) | ||||||
|  | @Target(TYPE) | ||||||
|  | public @interface JsonSerializable { | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,10 @@ | |||||||
|  | package com.baeldung.customannotations; | ||||||
|  | 
 | ||||||
|  | public class JsonSerializationException extends RuntimeException { | ||||||
|  | 
 | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  | 
 | ||||||
|  |     public JsonSerializationException(String message) { | ||||||
|  |         super(message); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,67 @@ | |||||||
|  | package com.baeldung.customannotations; | ||||||
|  | 
 | ||||||
|  | import java.lang.reflect.Field; | ||||||
|  | import java.lang.reflect.InvocationTargetException; | ||||||
|  | import java.lang.reflect.Method; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | 
 | ||||||
|  | public class ObjectToJsonConverter { | ||||||
|  |     public String convertToJson(Object object) throws JsonSerializationException { | ||||||
|  |         try { | ||||||
|  | 
 | ||||||
|  |             checkIfSerializable(object); | ||||||
|  |             initializeObject(object); | ||||||
|  |             return getJsonString(object); | ||||||
|  | 
 | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             throw new JsonSerializationException(e.getMessage()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void checkIfSerializable(Object object) { | ||||||
|  |         if (Objects.isNull(object)) { | ||||||
|  |             throw new JsonSerializationException("Can't serialize a null object"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         Class<?> clazz = object.getClass(); | ||||||
|  |         if (!clazz.isAnnotationPresent(JsonSerializable.class)) { | ||||||
|  |             throw new JsonSerializationException("The class " + clazz.getSimpleName() + " is not annotated with JsonSerializable"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void initializeObject(Object object) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { | ||||||
|  |         Class<?> clazz = object.getClass(); | ||||||
|  |         for (Method method : clazz.getDeclaredMethods()) { | ||||||
|  |             if (method.isAnnotationPresent(Init.class)) { | ||||||
|  |                 method.setAccessible(true); | ||||||
|  |                 method.invoke(object); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private String getJsonString(Object object) throws IllegalArgumentException, IllegalAccessException { | ||||||
|  |         Class<?> clazz = object.getClass(); | ||||||
|  |         Map<String, String> jsonElementsMap = new HashMap<>(); | ||||||
|  |         for (Field field : clazz.getDeclaredFields()) { | ||||||
|  |             field.setAccessible(true); | ||||||
|  |             if (field.isAnnotationPresent(JsonElement.class)) { | ||||||
|  |                 jsonElementsMap.put(getKey(field), (String) field.get(object)); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         String jsonString = jsonElementsMap.entrySet() | ||||||
|  |             .stream() | ||||||
|  |             .map(entry -> "\"" + entry.getKey() + "\":\"" + entry.getValue() + "\"") | ||||||
|  |             .collect(Collectors.joining(",")); | ||||||
|  |         return "{" + jsonString + "}"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private String getKey(Field field) { | ||||||
|  |         String value = field.getAnnotation(JsonElement.class) | ||||||
|  |             .key(); | ||||||
|  |         return value.isEmpty() ? field.getName() : value; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,66 @@ | |||||||
|  | package com.baeldung.customannotations; | ||||||
|  | 
 | ||||||
|  | @JsonSerializable | ||||||
|  | public class Person { | ||||||
|  |     @JsonElement | ||||||
|  |     private String firstName; | ||||||
|  |     @JsonElement | ||||||
|  |     private String lastName; | ||||||
|  |     @JsonElement(key = "personAge") | ||||||
|  |     private String age; | ||||||
|  | 
 | ||||||
|  |     private String address; | ||||||
|  | 
 | ||||||
|  |     public Person(String firstName, String lastName) { | ||||||
|  |         super(); | ||||||
|  |         this.firstName = firstName; | ||||||
|  |         this.lastName = lastName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public Person(String firstName, String lastName, String age) { | ||||||
|  |         this.firstName = firstName; | ||||||
|  |         this.lastName = lastName; | ||||||
|  |         this.age = age; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Init | ||||||
|  |     private void initNames() { | ||||||
|  |         this.firstName = this.firstName.substring(0, 1) | ||||||
|  |             .toUpperCase() + this.firstName.substring(1); | ||||||
|  |         this.lastName = this.lastName.substring(0, 1) | ||||||
|  |             .toUpperCase() + this.lastName.substring(1); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getFirstName() { | ||||||
|  |         return firstName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setFirstName(String firstName) { | ||||||
|  |         this.firstName = firstName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getLastName() { | ||||||
|  |         return lastName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setLastName(String lastName) { | ||||||
|  |         this.lastName = lastName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getAge() { | ||||||
|  |         return age; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setAge(String age) { | ||||||
|  |         this.age = age; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getAddress() { | ||||||
|  |         return address; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setAddress(String address) { | ||||||
|  |         this.address = address; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,26 @@ | |||||||
|  | package com.baeldung.customannotations; | ||||||
|  | 
 | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertEquals; | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertThrows; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | public class JsonSerializerUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenObjectNotSerializedThenExceptionThrown() throws JsonSerializationException { | ||||||
|  |         Object object = new Object(); | ||||||
|  |         ObjectToJsonConverter serializer = new ObjectToJsonConverter(); | ||||||
|  |         assertThrows(JsonSerializationException.class, () -> { | ||||||
|  |             serializer.convertToJson(object); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenObjectSerializedThenTrueReturned() throws JsonSerializationException { | ||||||
|  |         Person person = new Person("soufiane", "cheouati", "34"); | ||||||
|  |         ObjectToJsonConverter serializer = new ObjectToJsonConverter(); | ||||||
|  |         String jsonString = serializer.convertToJson(person); | ||||||
|  |         assertEquals("{\"personAge\":\"34\",\"firstName\":\"Soufiane\",\"lastName\":\"Cheouati\"}", jsonString); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user