From 9665de2dbe2be724ba3ce9a3a7b90ab07857fb62 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Wed, 13 Jan 2016 13:29:06 +1300 Subject: [PATCH] #502 - jsonContext.toJson(o, generator, path) can not apply path on @Transient field that is an entity bean --- .../server/deploy/BeanPropertyAssoc.java | 4 +- .../server/deploy/BeanPropertyAssocMany.java | 2 +- .../TestJsonExcludeTransientEmptyList.java | 17 ++++++ .../EJsonTransientEntityList.java | 57 +++++++++++++++++++ .../json/transientproperties/ModelA.java | 46 +++++++++++++++ .../json/transientproperties/ModelB.java | 31 ++++++++++ .../transientproperties/TestModelAJson.java | 34 +++++++++++ 7 files changed, 188 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/avaje/tests/json/transientproperties/EJsonTransientEntityList.java create mode 100644 src/test/java/com/avaje/tests/json/transientproperties/ModelA.java create mode 100644 src/test/java/com/avaje/tests/json/transientproperties/ModelB.java create mode 100644 src/test/java/com/avaje/tests/json/transientproperties/TestModelAJson.java diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssoc.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssoc.java index ea5fde515..21341e33d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssoc.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssoc.java @@ -85,8 +85,8 @@ public abstract class BeanPropertyAssoc extends BeanProperty { public void initialise() { // this *MUST* execute after the BeanDescriptor is // put into the map to stop infinite recursion - if (!isTransient){ - targetDescriptor = descriptor.getBeanDescriptor(targetType); + targetDescriptor = descriptor.getBeanDescriptor(targetType); + if (!isTransient){ targetIdBinder = targetDescriptor.getIdBinder(); targetInheritInfo = targetDescriptor.getInheritInfo(); saveRecurseSkippable = targetDescriptor.isSaveRecurseSkippable(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index 5e39a9e53..b08e86679 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -887,7 +887,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc { if (help != null) { help.jsonWrite(ctx, name, value, include != null); } else { - if (isTransient) { + if (isTransient && targetDescriptor == null) { ctx.writeValueUsingObjectMapper(name, value); } else { Collection collection = (Collection)value; diff --git a/src/test/java/com/avaje/tests/json/include/TestJsonExcludeTransientEmptyList.java b/src/test/java/com/avaje/tests/json/include/TestJsonExcludeTransientEmptyList.java index f75a6743a..13a8fdc2c 100644 --- a/src/test/java/com/avaje/tests/json/include/TestJsonExcludeTransientEmptyList.java +++ b/src/test/java/com/avaje/tests/json/include/TestJsonExcludeTransientEmptyList.java @@ -2,12 +2,15 @@ package com.avaje.tests.json.include; import com.avaje.ebean.Ebean; import com.avaje.ebean.config.JsonConfig; +import com.avaje.ebean.text.PathProperties; import com.avaje.ebean.text.json.JsonWriteOptions; +import com.avaje.tests.json.transientproperties.EJsonTransientEntityList; import com.avaje.tests.json.transientproperties.EJsonTransientList; import org.junit.Test; import java.util.ArrayList; +import static org.assertj.core.api.StrictAssertions.assertThat; import static org.junit.Assert.assertEquals; public class TestJsonExcludeTransientEmptyList { @@ -45,4 +48,18 @@ public class TestJsonExcludeTransientEmptyList { assertEquals(expectedJson, asJson); } + + @Test + public void testToJson_with_transientExcludeFromPathProperties() throws Exception { + + EJsonTransientEntityList bean = new EJsonTransientEntityList(); + bean.setId(99L); + bean.setName("John"); + + PathProperties pathProps = PathProperties.parse("id,name"); + + String asJson = Ebean.json().toJson(bean, pathProps); + + assertThat(asJson).isEqualTo("{\"id\":99,\"name\":\"John\"}"); + } } diff --git a/src/test/java/com/avaje/tests/json/transientproperties/EJsonTransientEntityList.java b/src/test/java/com/avaje/tests/json/transientproperties/EJsonTransientEntityList.java new file mode 100644 index 000000000..9059fd002 --- /dev/null +++ b/src/test/java/com/avaje/tests/json/transientproperties/EJsonTransientEntityList.java @@ -0,0 +1,57 @@ +package com.avaje.tests.json.transientproperties; + +import com.avaje.ebean.annotation.Sql; +import com.avaje.tests.model.basic.Order; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Transient; +import java.util.List; + +@Sql +@Entity +public class EJsonTransientEntityList { + + @Id + private Long id; + + private String name; + + @Transient + private Boolean basic; + + @Transient + private List orders; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Boolean getBasic() { + return basic; + } + + public void setBasic(Boolean basic) { + this.basic = basic; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } +} diff --git a/src/test/java/com/avaje/tests/json/transientproperties/ModelA.java b/src/test/java/com/avaje/tests/json/transientproperties/ModelA.java new file mode 100644 index 000000000..24e159b1c --- /dev/null +++ b/src/test/java/com/avaje/tests/json/transientproperties/ModelA.java @@ -0,0 +1,46 @@ +package com.avaje.tests.json.transientproperties; + +import com.avaje.ebean.annotation.Sql; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Transient; +import java.util.List; + +@Sql +@Entity +public class ModelA { + + @Id + int id; + + String a; + + // transient mapping to an entity bean + @Transient + List list; + + public String getA() { + return a; + } + + public void setA(String a) { + this.a = a; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } +} diff --git a/src/test/java/com/avaje/tests/json/transientproperties/ModelB.java b/src/test/java/com/avaje/tests/json/transientproperties/ModelB.java new file mode 100644 index 000000000..8df6570e0 --- /dev/null +++ b/src/test/java/com/avaje/tests/json/transientproperties/ModelB.java @@ -0,0 +1,31 @@ +package com.avaje.tests.json.transientproperties; + + +import com.avaje.ebean.annotation.Sql; + +import javax.persistence.Entity; + +@Sql +@Entity +public class ModelB { + + Integer oneField; + + Integer twoField; + + public Integer getOneField() { + return oneField; + } + + public void setOneField(Integer oneField) { + this.oneField = oneField; + } + + public Integer getTwoField() { + return twoField; + } + + public void setTwoField(Integer twoField) { + this.twoField = twoField; + } +} \ No newline at end of file diff --git a/src/test/java/com/avaje/tests/json/transientproperties/TestModelAJson.java b/src/test/java/com/avaje/tests/json/transientproperties/TestModelAJson.java new file mode 100644 index 000000000..c6dc250af --- /dev/null +++ b/src/test/java/com/avaje/tests/json/transientproperties/TestModelAJson.java @@ -0,0 +1,34 @@ +package com.avaje.tests.json.transientproperties; + +import com.avaje.ebean.Ebean; +import com.avaje.ebean.text.PathProperties; +import org.junit.Test; + +import java.util.ArrayList; + +import static org.assertj.core.api.StrictAssertions.assertThat; + +public class TestModelAJson { + + @Test + public void test() { + + ModelA a = new ModelA(); + a.setId(1); + a.setA("a"); + + ModelB b = new ModelB(); + b.setOneField(1); + b.setTwoField(1); + + a.setList(new ArrayList()); + a.getList().add(b); + + PathProperties pathProperties = PathProperties.parse("(a,list(oneField))"); + + String json = Ebean.json().toJson(a, pathProperties); + + assertThat(json).isEqualTo("{\"a\":\"a\",\"list\":[{\"oneField\":1}]}"); + + } +}