Author: gk
Date: Thu Jul 12 09:34:57 2018
New Revision: 1835712
URL: http://svn.apache.org/viewvc?rev=1835712&view=rev
Log:
- fix: use writer (per-call), if possible, not global mapper
- fix JACKSON-650 (ignore empty filter error) - set it global, may occur if any
filter was set previously (even per-call) for a class type.
- add tests for array / collection type
Modified:
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java
Modified:
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java
URL:
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java?rev=1835712&r1=1835711&r2=1835712&view=diff
==============================================================================
---
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java
(original)
+++
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java
Thu Jul 12 09:34:57 2018
@@ -150,8 +150,8 @@ public class Jackson2MapperService exten
}
}
getLogger().debug("ser class::" + src.getClass() + " with filter " +
filter);
- mapper.setFilterProvider(filter);
- String res = mapper.writer(filter).writeValueAsString(src);
+ //mapper.setFilterProvider(filter);// this is global
+ String res = mapper.writer().with(filter).writeValueAsString(src);
if (cleanCache) {
cacheService.cleanSerializerCache(mapper);
}
@@ -169,7 +169,7 @@ public class Jackson2MapperService exten
// src.getClass().getName());
SimpleFilterProvider filter = (SimpleFilterProvider)
cacheService.getFilters().get(src.getClass()
.getName());
- return ser(src, filter,
cleanCache);//mapper.writerWithView(src.getClass()).writeValueAsString(src);
+ return ser(src, filter, cleanCache);
}
String res =
mapper.writerWithView(Object.class).writeValueAsString(src);
if (cleanCache != null && cleanCache) {
@@ -181,7 +181,7 @@ public class Jackson2MapperService exten
@Override
public <T> String ser(Object src, Class<T> type, Boolean cleanCache)
throws Exception {
- getLogger().info("serializing object:" + src + " for type "+ type);
+ getLogger().debug("serializing object:" + src + " for type "+ type);
if (src != null &&
cacheService.getFilters().containsKey(src.getClass().getName())) {
getLogger()
.warn("Found registered filter - could not use custom view
and custom filter for class:"
@@ -193,8 +193,8 @@ public class Jackson2MapperService exten
.getName());
return ser(src, filter);
}
-
- String res = (type != null)?
mapper.writerWithView(type).writeValueAsString(src):
mapper.writeValueAsString(src);
+ mapper.setFilterProvider(new
SimpleFilterProvider().setFailOnUnknownId(false));
+ String res = (type != null)?
mapper.writerWithView(type).writeValueAsString(src):
mapper.writer().writeValueAsString(src);
if (cleanCache) {
cacheService.cleanSerializerCache(mapper);
}
@@ -204,6 +204,22 @@ public class Jackson2MapperService exten
}
return res;
}
+
+
+ public <T> String ser( Object... objects) throws Exception {
+ return ser( objects, false );
+ }
+ /**
+ * convenience method to provide a list of coolections without providign a
wrapper
+ * @param cleanCache
+ * @param objects
+ * @return serialized JSON
+ * @throws Exception
+ */
+ public <T> String ser(Boolean cleanCache, Object... objects) throws
Exception {
+ return ser( objects, cleanCache );
+ }
+
@Override
public <T> T deSer(String json, Class<T> type) throws Exception {
@@ -812,8 +828,9 @@ public class Jackson2MapperService exten
"JsonMapperService: Error instantiating " + djpw
+ " using useJsonPath=" + useJsonPath);
}
-
}
+ // JACKSON-650, Ignore missing filters, may be, because previoulsy a
filter was set (e.g. ignore filter)
+ mapper.setFilterProvider(new
SimpleFilterProvider().setFailOnUnknownId(false));
}
public ObjectMapper getMapper() {
Modified:
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java
URL:
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java?rev=1835712&r1=1835711&r2=1835712&view=diff
==============================================================================
---
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java
(original)
+++
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java
Thu Jul 12 09:34:57 2018
@@ -39,4 +39,11 @@ public final class MixinModule extends S
public void setupModule(SetupContext context) {
context.setMixInAnnotations(this.clazz, this.mixin);
}
+
+// @Override
+// public Object getTypeId()
+// {
+// return null; // unique
+// //return super.getTypeId();
+// }
}
\ No newline at end of file
Modified:
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java
URL:
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java?rev=1835712&r1=1835711&r2=1835712&view=diff
==============================================================================
---
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java
(original)
+++
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java
Thu Jul 12 09:34:57 2018
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTru
import static org.junit.Assert.fail;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
@@ -45,6 +46,10 @@ import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
/**
@@ -109,8 +114,8 @@ public class JacksonMapperTest extends B
Rectangle.class, "w", "name");
assertEquals("Ser filtered Rectangle failed ",
"{\"w\":5,\"name\":\"jim\"}", filteredRectangle);
-
}
+
@Test
public void testSerializationCollectionWithFilter() throws Exception {
@@ -436,6 +441,91 @@ public class JacksonMapperTest extends B
assertTrue(((List<Rectangle>)resultList3).get(i).getName()!=null);
}
}
+
+ @Test
+ public void testSerializeListWithWrapper() {
+ try
+ {
+ Bean bean = new Bean();
+ bean.setName("joe");
+ bean.setAge(12);
+ String filteredBean = sc.serializeOnlyFilter(bean, Bean.class,
"name");
+ assertEquals("Ser filtered Bean failed ", "{\"name\":\"joe\"}",
filteredBean);
+
+ Rectangle rectangle = new Rectangle(5, 10);
+ rectangle.setName("quadro");
+ String filteredRectangle = sc.serializeOnlyFilter(rectangle,
+ Rectangle.class, "w", "name");
+ assertEquals("Ser filtered Rectangle failed ",
+ "{\"w\":5,\"name\":\"quadro\"}", filteredRectangle);
+
+ Bean bean2 = new Bean();
+ bean2.setName("jim");
+ bean2.setAge(92);
+ List<Bean> beans = Arrays.asList( bean, bean2 );
+ List<Rectangle> rectangles = Arrays.asList( rectangle );
+ List wrapper = new ArrayList();
+ wrapper.addAll( beans ); wrapper.addAll( rectangles );
+
+ //String wrappedLists = sc.serializeOnlyFilter( wrapper, "name" );
+ String jsonResult = sc.ser( wrapper );
+ //
res:wrappedLists:[{"name":"joe","age":12,"profession":""},{"w":5,"h":10,"name":"jim","size":50}]
+ logger.debug( "jsonResult provided wrapper:" +jsonResult );
+ List listResult = (List)
((Jackson2MapperService)sc).deSerCollectionWithType( jsonResult,
ArrayList.class,Object.class );
+ logger.debug( " provided wrapper lists:" +listResult );
+
+ String jsonResult2 = ((Jackson2MapperService)sc).ser( false,
bean, bean2, rectangle );
+ logger.debug( "jsonResult2 bean, rectangle / no collection:"
+jsonResult2 );
+ List listResult2 = (List)
((Jackson2MapperService)sc).deSerCollectionWithType( jsonResult2,
ArrayList.class,Object.class );
+ logger.debug( "bean, rectangle / no collection lists:"
+listResult2 );
+ assertTrue( jsonResult.equals( jsonResult2 ) );
+ listResult2.removeAll( listResult );
+ assertTrue( listResult2.isEmpty() );
+
+ String jsonResult3 = ((Jackson2MapperService)sc).ser( false,
(Collection)beans, (Collection)rectangles );
+ // this wrape anything
+ logger.debug( "jsonResult3 raw lists:" +jsonResult3 );
+ List<List> listResult3 = (List)
((Jackson2MapperService)sc).deSerCollectionWithType( jsonResult3,
ArrayList.class,List.class );
+ logger.debug( "raw lists:" +listResult3 );
+ listResult3.get( 0 ).removeAll( listResult );
+ listResult3.get( 1 ).removeAll( listResult );
+ assertTrue( listResult3.get( 0 ).isEmpty() );
+ assertTrue( listResult3.get( 1 ).isEmpty() );
+
+ // this does not get any information, just to demonstrate
+ TypeReference<List<?>> typeRef = new TypeReference<List<?>>(){};
+ String jsonResult4 =
((Jackson2MapperService)sc).serCollectionWithTypeReference(wrapper,typeRef,
false);
+ logger.debug( "jsonResult4 typereference:" +jsonResult4 );
+ List<Object> listResult4 = (List)
((Jackson2MapperService)sc).deSerCollectionWithType( jsonResult4,
ArrayList.class,Object.class );
+ logger.debug( "typereference lists:" +listResult4 );
+ listResult4.removeAll( listResult );
+ assertTrue( listResult4.isEmpty() );
+
+
((Jackson2MapperService)sc).getMapper().enable(SerializationFeature.WRAP_ROOT_VALUE);
+ String jsonResult5 = sc.ser( wrapper );
+ //
res:wrappedLists:[{"name":"joe","age":12,"profession":""},{"w":5,"h":10,"name":"jim","size":50}]
+ logger.debug( "jsonResult5 wrap root:" +jsonResult5 );
+
+
((Jackson2MapperService)sc).getMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
true);
+ List<Object> listResult5 = (List) ((Jackson2MapperService)sc)
+ .deSerCollectionWithType( jsonResult4,
ArrayList.class,Object.class );
+ logger.debug( "wrap root lists:" +listResult5 );
+ listResult5.removeAll( listResult );
+ assertTrue( listResult5.isEmpty() );
+ List<Object> listResult51 = (List) ((Jackson2MapperService)sc)
+ .deSerCollectionWithTypeReference( jsonResult5,
new TypeReference<List<?>>() {} );
+ logger.debug( "wrap root lists typereferenced:" +listResult51 );
+ ((Map<String, List>)listResult51.get( 0
)).values().iterator().next().removeAll( listResult );
+ assertTrue( ((Map<String, List>)listResult51.get( 0
)).values().iterator().next().isEmpty() );
+
+
+ }
+ catch ( Exception e )
+ {
+ e.printStackTrace();
+ fail();
+ }
+ }
public static abstract class Mixin2 {