From fed7237503c05276265b61d4f5507329ead6aa2a Mon Sep 17 00:00:00 2001 From: fp024 Date: Mon, 6 Jul 2026 19:59:36 +0900 Subject: [PATCH 1/3] Add tests for json-customize example --- json-customize/pom.xml | 52 +++++++++-- .../java/org/demo/ExcludeTransformer.java | 4 +- .../main/java/org/demo/FlexJSONWriter.java | 7 +- .../src/main/java/org/demo/ProduceAction.java | 89 +++++++++---------- json-customize/src/main/resources/struts.xml | 4 +- .../src/main/webapp/WEB-INF/web.xml | 11 +-- .../test/java/org/demo/ProduceActionTest.java | 50 +++++++++++ 7 files changed, 152 insertions(+), 65 deletions(-) create mode 100644 json-customize/src/test/java/org/demo/ProduceActionTest.java diff --git a/json-customize/pom.xml b/json-customize/pom.xml index 61c9badf..50d1496d 100644 --- a/json-customize/pom.xml +++ b/json-customize/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 struts-examples @@ -15,6 +16,14 @@ UTF-8 + + 7.1.1 + 2.26.1 + 3.3 + + 4.13.2 + 6.2.12 + 3.0.0 @@ -34,13 +43,46 @@ net.sf.flexjson flexjson - 3.3 + ${flexjson.version} + + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + + org.apache.logging.log4j + log4j-slf4j2-impl + ${log4j.version} + + + + org.springframework + spring-web + ${spring.version} + test + + + + com.jayway.jsonpath + json-path + ${json-path.version} + test + + + + org.apache.struts + struts2-junit-plugin + ${struts2.version} + test junit junit - 4.13.2 + ${junit.version} test @@ -63,4 +105,4 @@ - + \ No newline at end of file diff --git a/json-customize/src/main/java/org/demo/ExcludeTransformer.java b/json-customize/src/main/java/org/demo/ExcludeTransformer.java index e2a8fa10..165108af 100644 --- a/json-customize/src/main/java/org/demo/ExcludeTransformer.java +++ b/json-customize/src/main/java/org/demo/ExcludeTransformer.java @@ -3,7 +3,5 @@ import flexjson.transformer.AbstractTransformer; public class ExcludeTransformer extends AbstractTransformer { - public void transform(Object o) { - return; - } + public void transform(Object o) {} } diff --git a/json-customize/src/main/java/org/demo/FlexJSONWriter.java b/json-customize/src/main/java/org/demo/FlexJSONWriter.java index 7f241397..124a38fd 100644 --- a/json-customize/src/main/java/org/demo/FlexJSONWriter.java +++ b/json-customize/src/main/java/org/demo/FlexJSONWriter.java @@ -21,12 +21,11 @@ import flexjson.JSONSerializer; import flexjson.transformer.DateTransformer; -import org.apache.struts2.json.JSONException; -import org.apache.struts2.json.JSONWriter; - import java.util.Collection; import java.util.Date; import java.util.regex.Pattern; +import org.apache.struts2.json.JSONException; +import org.apache.struts2.json.JSONWriter; /** * Customized JSONWriter using Flexjson @@ -41,7 +40,7 @@ public String write(Object object) throws JSONException { public String write(Object object, Collection excludeProperties, Collection includeProperties, boolean excludeNullProperties) throws JSONException { - JSONSerializer serializer = new JSONSerializer(); + JSONSerializer serializer = new JSONSerializer().exclude("*.class"); if (excludeProperties != null) { for (Pattern p : excludeProperties) { serializer = serializer.exclude(p.pattern()); diff --git a/json-customize/src/main/java/org/demo/ProduceAction.java b/json-customize/src/main/java/org/demo/ProduceAction.java index 8f30ceba..61476c16 100644 --- a/json-customize/src/main/java/org/demo/ProduceAction.java +++ b/json-customize/src/main/java/org/demo/ProduceAction.java @@ -19,65 +19,62 @@ package org.demo; -import org.apache.struts2.ActionSupport; - import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import org.apache.struts2.ActionSupport; -/** - * Set welcome message. - */ +/** Set welcome message. */ public class ProduceAction extends ActionSupport { - private User user; + private User user; - public String execute() throws Exception { - user = new User(); + public String execute() throws Exception { + user = new User(); - user.setName("William Shakespeare"); + user.setName("William Shakespeare"); - SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy"); - user.setBirthday(formatter.parse("26-Apr-1564")); + SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy"); + user.setBirthday(formatter.parse("26-04-1564")); - List phoneNumbers = new ArrayList(); - Phone phone = new Phone(); - phone.setName("cell"); - phone.setNumber("555-123-4567"); - phoneNumbers.add(phone); - phone = new Phone(); - phone.setName("home"); - phone.setNumber("555-987-6543"); - phoneNumbers.add(phone); - phone = new Phone(); - phone.setName("work"); - phone.setNumber("555-678-3542"); - phoneNumbers.add(phone); - user.setPhoneNumbers(phoneNumbers); + List phoneNumbers = new ArrayList<>(); + Phone phone = new Phone(); + phone.setName("cell"); + phone.setNumber("555-123-4567"); + phoneNumbers.add(phone); + phone = new Phone(); + phone.setName("home"); + phone.setNumber("555-987-6543"); + phoneNumbers.add(phone); + phone = new Phone(); + phone.setName("work"); + phone.setNumber("555-678-3542"); + phoneNumbers.add(phone); + user.setPhoneNumbers(phoneNumbers); - List
addresses = new ArrayList
(); - Address address = new Address(); - address.setName("home"); - address.setCity("Stratford-upon-Avon"); - address.setStreet("Henley"); - List zipcodes = new ArrayList(); - Zipcode zipcode = new Zipcode(); - zipcode.setCode("CV37"); - zipcodes.add(zipcode); - address.setZipcodes(zipcodes); - addresses.add(address); - user.setAddresses(addresses); + List
addresses = new ArrayList<>(); + Address address = new Address(); + address.setName("home"); + address.setCity("Stratford-upon-Avon"); + address.setStreet("Henley"); + List zipcodes = new ArrayList<>(); + Zipcode zipcode = new Zipcode(); + zipcode.setCode("CV37"); + zipcodes.add(zipcode); + address.setZipcodes(zipcodes); + addresses.add(address); + user.setAddresses(addresses); - user.setLogin("WillShak"); - user.setHashedPassword("9e107d9d372bb6826bd81d3542a419d6"); - user.setLastLogin(new Date()); - user.setPassword("will123shak456"); + user.setLogin("WillShak"); + user.setHashedPassword("9e107d9d372bb6826bd81d3542a419d6"); + user.setLastLogin(new Date()); + user.setPassword("will123shak456"); - return SUCCESS; - } + return SUCCESS; + } - public User getUser() { - return user; - } + public User getUser() { + return user; + } } diff --git a/json-customize/src/main/resources/struts.xml b/json-customize/src/main/resources/struts.xml index ea30cb45..5f63ddf7 100644 --- a/json-customize/src/main/resources/struts.xml +++ b/json-customize/src/main/resources/struts.xml @@ -1,7 +1,7 @@ + "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN" + "http://struts.apache.org/dtds/struts-6.0.dtd"> diff --git a/json-customize/src/main/webapp/WEB-INF/web.xml b/json-customize/src/main/webapp/WEB-INF/web.xml index 88586569..1a6ee72c 100644 --- a/json-customize/src/main/webapp/WEB-INF/web.xml +++ b/json-customize/src/main/webapp/WEB-INF/web.xml @@ -1,9 +1,10 @@ - - Struts Blank + + + Struts JSON Customize Example struts2 diff --git a/json-customize/src/test/java/org/demo/ProduceActionTest.java b/json-customize/src/test/java/org/demo/ProduceActionTest.java new file mode 100644 index 00000000..b5527b24 --- /dev/null +++ b/json-customize/src/test/java/org/demo/ProduceActionTest.java @@ -0,0 +1,50 @@ +package org.demo; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import com.jayway.jsonpath.JsonPath; +import jakarta.servlet.ServletException; +import java.io.UnsupportedEncodingException; +import java.util.List; +import org.apache.struts2.dispatcher.mapper.ActionMapping; +import org.apache.struts2.junit.StrutsJUnit4TestCase; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ProduceActionTest extends StrutsJUnit4TestCase { + private static final Logger log = LoggerFactory.getLogger(ProduceActionTest.class); + + @Test + public void getActionMapping() { + ActionMapping mapping = getActionMapping("/produce.action"); + assertNotNull(mapping); + assertEquals("/", mapping.getNamespace()); + assertEquals("produce", mapping.getName()); + } + + @Test + public void executeAction() throws ServletException, UnsupportedEncodingException { + String output = executeAction("/produce.action"); + log.info("output: {}", output); + + assertNotNull(output); + assertEquals("William Shakespeare", JsonPath.read(output, "$.name")); + assertEquals("WillShak", JsonPath.read(output, "$.username")); + assertEquals("******", JsonPath.read(output, "$.password")); + assertEquals("04/26/1564", JsonPath.read(output, "$.birthday")); + + assertEquals("Stratford-upon-Avon", JsonPath.read(output, "$.addresses[0].city")); + assertEquals("home", JsonPath.read(output, "$.addresses[0].name")); + assertEquals("Henley", JsonPath.read(output, "$.addresses[0].street")); + + List addresses = JsonPath.read(output, "$.addresses"); + assertEquals(1, addresses.size()); + + String lastLogin = JsonPath.read(output, "$.lastLogin"); + assertNotNull(lastLogin); + assertTrue(lastLogin.matches("\\d{2}/\\d{2}/\\d{4}")); + } +} From b7b7b9f0c2a79baee84552bd03d4f8dd40855a61 Mon Sep 17 00:00:00 2001 From: fp024 Date: Mon, 6 Jul 2026 20:59:14 +0900 Subject: [PATCH 2/3] Use Struts version from root pom --- json-customize/pom.xml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/json-customize/pom.xml b/json-customize/pom.xml index 50d1496d..83d301bd 100644 --- a/json-customize/pom.xml +++ b/json-customize/pom.xml @@ -16,9 +16,6 @@ UTF-8 - - 7.1.1 - 2.26.1 3.3 4.13.2 @@ -49,13 +46,13 @@ org.apache.logging.log4j log4j-core - ${log4j.version} + ${log4j2.version} org.apache.logging.log4j log4j-slf4j2-impl - ${log4j.version} + ${log4j2.version} From 8c7fbc11a195a894b896cfb4fe177b6e2726b4ad Mon Sep 17 00:00:00 2001 From: fp024 Date: Tue, 7 Jul 2026 00:16:40 +0900 Subject: [PATCH 3/3] correct null-field exclusion output and migrate JSON assertions - fix flexjson serialization to fully exclude null fields - replace JSON verification with "json-unit-assertj" --- json-customize/pom.xml | 24 ++++++++-------- .../java/org/demo/ExcludeTransformer.java | 6 ++++ .../test/java/org/demo/ProduceActionTest.java | 28 +++++++++---------- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/json-customize/pom.xml b/json-customize/pom.xml index 83d301bd..4c355256 100644 --- a/json-customize/pom.xml +++ b/json-customize/pom.xml @@ -19,8 +19,7 @@ 3.3 4.13.2 - 6.2.12 - 3.0.0 + 5.1.2 @@ -43,12 +42,6 @@ ${flexjson.version} - - org.apache.logging.log4j - log4j-core - ${log4j2.version} - - org.apache.logging.log4j log4j-slf4j2-impl @@ -58,14 +51,21 @@ org.springframework spring-web - ${spring.version} + ${spring-web.version} + test + + + + net.javacrumbs.json-unit + json-unit-assertj + ${json-unit-assertj.version} test + - com.jayway.jsonpath - json-path - ${json-path.version} + com.fasterxml.jackson.core + jackson-databind test diff --git a/json-customize/src/main/java/org/demo/ExcludeTransformer.java b/json-customize/src/main/java/org/demo/ExcludeTransformer.java index 165108af..15e73ed0 100644 --- a/json-customize/src/main/java/org/demo/ExcludeTransformer.java +++ b/json-customize/src/main/java/org/demo/ExcludeTransformer.java @@ -3,5 +3,11 @@ import flexjson.transformer.AbstractTransformer; public class ExcludeTransformer extends AbstractTransformer { + @Override + public Boolean isInline() { + return true; + } + + @Override public void transform(Object o) {} } diff --git a/json-customize/src/test/java/org/demo/ProduceActionTest.java b/json-customize/src/test/java/org/demo/ProduceActionTest.java index b5527b24..214d300c 100644 --- a/json-customize/src/test/java/org/demo/ProduceActionTest.java +++ b/json-customize/src/test/java/org/demo/ProduceActionTest.java @@ -2,12 +2,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; -import com.jayway.jsonpath.JsonPath; import jakarta.servlet.ServletException; import java.io.UnsupportedEncodingException; -import java.util.List; import org.apache.struts2.dispatcher.mapper.ActionMapping; import org.apache.struts2.junit.StrutsJUnit4TestCase; import org.junit.Test; @@ -31,20 +29,20 @@ public void executeAction() throws ServletException, UnsupportedEncodingExceptio log.info("output: {}", output); assertNotNull(output); - assertEquals("William Shakespeare", JsonPath.read(output, "$.name")); - assertEquals("WillShak", JsonPath.read(output, "$.username")); - assertEquals("******", JsonPath.read(output, "$.password")); - assertEquals("04/26/1564", JsonPath.read(output, "$.birthday")); + + assertThatJson(output).node("nickname").isAbsent(); + + assertThatJson(output).node("name").isEqualTo("William Shakespeare"); + assertThatJson(output).node("username").isEqualTo("WillShak"); + assertThatJson(output).node("password").isEqualTo("******"); + assertThatJson(output).node("birthday").isEqualTo("04/26/1564"); - assertEquals("Stratford-upon-Avon", JsonPath.read(output, "$.addresses[0].city")); - assertEquals("home", JsonPath.read(output, "$.addresses[0].name")); - assertEquals("Henley", JsonPath.read(output, "$.addresses[0].street")); + assertThatJson(output).node("addresses[0].city").isEqualTo("Stratford-upon-Avon"); + assertThatJson(output).node("addresses[0].name").isEqualTo("home"); + assertThatJson(output).node("addresses[0].street").isEqualTo("Henley"); - List addresses = JsonPath.read(output, "$.addresses"); - assertEquals(1, addresses.size()); + assertThatJson(output).node("addresses").isArray().hasSize(1); - String lastLogin = JsonPath.read(output, "$.lastLogin"); - assertNotNull(lastLogin); - assertTrue(lastLogin.matches("\\d{2}/\\d{2}/\\d{4}")); + assertThatJson(output).node("lastLogin").isString().matches("\\d{2}/\\d{2}/\\d{4}"); } }