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 {