| :index-group: JSON-B |
| :jbake-type: page |
| :jbake-status: status=published |
| = JSON-B Custom Serializer |
| |
| This examples shows how to customize objects |
| serialization/deserialization with jsonb for a JAX-RS Application. |
| |
| == Run and test Endpoint |
| |
| the application can be run with `mvn clean install tomee:run' if port |
| 8080 is available you can invoke the following endpoint: (GET) |
| http://localhost:8080/jsonb-custom-serializer/api/users that should |
| respond with the following json: |
| |
| [source,java] |
| ---- |
| [ |
| { |
| "address":{ |
| "addr":"modified - addr1" |
| }, |
| "id":1, |
| "name":"user 1", |
| "registration":"2018-12-29T18:13:40.028" |
| }, |
| { |
| "address":{ |
| "addr":"modified - addr2" |
| }, |
| "id":2, |
| "name":"user 2", |
| "registration":"2018-12-29T18:13:40.028" |
| } |
| ] |
| ---- |
| |
| and the endpoint: (POST) |
| http://localhost:8080/jsonb-custom-serializer/api/users with a body |
| like: |
| |
| [source,java] |
| ---- |
| { |
| "id": 1, |
| "name": "name1", |
| "extra": "extra1" |
| } |
| ---- |
| |
| which respond with the following json: |
| |
| [source,java] |
| ---- |
| { |
| "id": 1, |
| "name": "name1extra1", |
| "registration": "Sat Dec 29 19:48:05 CET 2018", |
| "address": null |
| } |
| ---- |
| |
| == @ApplicationPath |
| |
| JAXRS entry point class, as follows jaxrs will load all the annotated |
| @Path classes and methods without specifying them. |
| |
| [source,java] |
| ---- |
| import javax.ws.rs.ApplicationPath; |
| import javax.ws.rs.core.Application; |
| |
| @ApplicationPath("api") |
| public class JAXRSApplication extends Application { |
| |
| } |
| ---- |
| |
| == @Path Rest resource |
| |
| Simple jaxrs class with a GET and a POST endpoint |
| |
| [source,java] |
| ---- |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import javax.ejb.Stateless; |
| import javax.ws.rs.Consumes; |
| import javax.ws.rs.GET; |
| import javax.ws.rs.POST; |
| import javax.ws.rs.Path; |
| import javax.ws.rs.Produces; |
| import javax.ws.rs.core.MediaType; |
| |
| import org.superbiz.model.Address; |
| import org.superbiz.model.User; |
| |
| @Path("users") |
| @Produces(MediaType.APPLICATION_JSON) |
| @Consumes(MediaType.APPLICATION_JSON) |
| @Stateless |
| public class UserService { |
| |
| @GET |
| public List<User> users() { |
| List<User> users = new ArrayList<>(); |
| User user1 = new User(1, "user 1", new Address("addr1")); |
| User user2 = new User(2, "user 2", new Address("addr2")); |
| users.add(user1); |
| users.add(user2); |
| |
| return users; |
| } |
| |
| @POST |
| public User addUser(User u) { |
| // Just to show the deserialization |
| return u; |
| } |
| } |
| ---- |
| |
| == JSONB Configuration |
| |
| Implementing ContextResolver<> you can customize jaxrs defaults, in this |
| example we are going to customize JSONB serialization for all objects of |
| type Address, defined in AddressSerializer class |
| |
| [source,java] |
| ---- |
| import javax.json.bind.Jsonb; |
| import javax.json.bind.JsonbBuilder; |
| import javax.json.bind.JsonbConfig; |
| import javax.ws.rs.ext.ContextResolver; |
| import javax.ws.rs.ext.Provider; |
| |
| @Provider |
| public class JSONBConfiguration implements ContextResolver<Jsonb> { |
| |
| private Jsonb jsonb; |
| |
| public JSONBConfiguration() { |
| JsonbConfig config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer()); |
| |
| jsonb = JsonbBuilder.create(config); |
| } |
| |
| @Override |
| public Jsonb getContext(Class<?> type) { |
| return jsonb; |
| } |
| |
| } |
| ---- |
| |
| == Address serializer |
| |
| Simple Object serializer class that add `modified' during serialization |
| |
| [source,java] |
| ---- |
| import javax.json.bind.serializer.JsonbSerializer; |
| import javax.json.bind.serializer.SerializationContext; |
| import javax.json.stream.JsonGenerator; |
| |
| import org.superbiz.model.Address; |
| |
| public class AddressSerializer implements JsonbSerializer<Address> { |
| |
| @Override |
| public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) { |
| if (obj != null) { |
| obj.setAddr("modified - " + obj.getAddr()); |
| ctx.serialize(obj, generator); |
| } |
| |
| } |
| |
| } |
| ---- |
| |
| == User Deserializer |
| |
| Create an object from a json |
| |
| [source,java] |
| ---- |
| import java.lang.reflect.Type; |
| |
| import javax.json.JsonObject; |
| import javax.json.bind.serializer.DeserializationContext; |
| import javax.json.bind.serializer.JsonbDeserializer; |
| import javax.json.stream.JsonParser; |
| |
| import org.superbiz.model.User; |
| |
| public class UserDeserializer implements JsonbDeserializer<User> { |
| |
| @Override |
| public User deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) { |
| JsonObject jo = parser.getObject(); |
| String name = jo.get("name").toString().replace("\"", ""); |
| if (jo.get("extra") != null) { |
| name = name + jo.get("extra").toString().replace("\"", ""); |
| } |
| User u = new User(Integer.parseInt(jo.get("id").toString()), name, null); |
| |
| return u; |
| } |
| |
| } |
| ---- |
| |
| == Using the deserializer @JsonbTypeDeserializer @JsonbTypeSerializer |
| |
| With the annotation @JsonbTypeDeserializer or @JsonbTypeSerializer you |
| can notify jsonb to use the custom deserializer |
| |
| [source,java] |
| ---- |
| import java.util.Date; |
| |
| import javax.json.bind.annotation.JsonbTypeDeserializer; |
| |
| import org.superbiz.UserDeserializer; |
| |
| @JsonbTypeDeserializer(UserDeserializer.class) |
| public class User { |
| |
| private Integer id; |
| private String name; |
| private Date registration = new Date(); |
| private Address address; |
| |
| public User(Integer id, String name, Address address) { |
| super(); |
| this.id = id; |
| this.name = name; |
| this.address = address; |
| } |
| |
| public User() { |
| super(); |
| } |
| |
| // ... GET/SET |
| |
| } |
| ---- |
| |
| == Accessing the rest endpoint |
| |
| The test spin up an openejb webapp and invoke the users endpoint |
| |
| [source,java] |
| ---- |
| import java.io.IOException; |
| |
| import javax.ws.rs.core.MediaType; |
| |
| import org.apache.cxf.jaxrs.client.WebClient; |
| import org.apache.openejb.jee.WebApp; |
| import org.apache.openejb.junit.ApplicationComposer; |
| import org.apache.openejb.testing.Classes; |
| import org.apache.openejb.testing.EnableServices; |
| import org.apache.openejb.testing.Module; |
| import org.junit.Assert; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.superbiz.JAXRSApplication; |
| import org.superbiz.JSONBConfiguration; |
| import org.superbiz.model.User; |
| |
| @EnableServices(value = "jaxrs") |
| @RunWith(ApplicationComposer.class) |
| public class UserServiceTest { |
| |
| @Module |
| @Classes({ UserService.class, JAXRSApplication.class, JSONBConfiguration.class }) |
| public WebApp app() { |
| return new WebApp().contextRoot("test"); |
| } |
| |
| @Test |
| public void get() throws IOException { |
| final String message = WebClient.create("http://localhost:4204").path("/test/api/users").get(String.class); |
| |
| Assert.assertTrue(message.contains("modified - addr1")); |
| } |
| |
| @Test |
| public void post() throws IOException { |
| final String inputJson = "{ \"id\": 1, \"name\": \"user1\", \"extra\": \"extraField\"}"; |
| final User responseUser = WebClient.create("http://localhost:4204").path("/test/api/users") |
| .type(MediaType.APPLICATION_JSON).post(inputJson, User.class); |
| |
| Assert.assertTrue(!responseUser.getName().equals("user1")); |
| Assert.assertTrue(responseUser.getName().equals("user1" + "extraField")); |
| } |
| |
| } |
| ---- |
| |
| == Running |
| |
| Running the example can be done from maven with a simple `mvn clean |
| install' command run from the `jsonb-custom-serializer' directory. |
| |
| When run you should see output similar to the following. |
| |
| [source,console] |
| ---- |
| ------------------------------------------------------- |
| T E S T S |
| ------------------------------------------------------- |
| Running org.superbiz.rest.UserServiceTest |
| INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@7823a2f9 |
| INFO - Succeeded in installing singleton service |
| INFO - Cannot find the configuration file [conf/openejb.xml]. Will attempt to create one for the beans deployed. |
| INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) |
| INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) |
| INFO - Creating TransactionManager(id=Default Transaction Manager) |
| INFO - Creating SecurityService(id=Default Security Service) |
| INFO - Initializing network services |
| INFO - Creating ServerService(id=cxf-rs) |
| INFO - Creating ServerService(id=httpejbd) |
| INFO - Created ServicePool 'httpejbd' with (10) core threads, limited to (200) threads with a queue of (9) |
| INFO - Initializing network services |
| INFO - ** Bound Services ** |
| INFO - NAME IP PORT |
| INFO - httpejbd 127.0.0.1 4204 |
| INFO - ------- |
| INFO - Ready! |
| INFO - Configuring enterprise application: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest |
| INFO - Auto-deploying ejb UserService: EjbDeployment(deployment-id=UserService) |
| INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) |
| INFO - Auto-creating a container for bean org.superbiz.rest.UserServiceTest: Container(type=MANAGED, id=Default Managed Container) |
| INFO - Creating Container(id=Default Managed Container) |
| INFO - Using directory /tmp for stateful session passivation |
| INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container) |
| INFO - Auto-creating a container for bean UserService: Container(type=STATELESS, id=Default Stateless Container) |
| INFO - Creating Container(id=Default Stateless Container) |
| INFO - Enterprise application "/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest" loaded. |
| INFO - Creating dedicated application classloader for UserServiceTest |
| INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest |
| INFO - Jndi(name=UserServiceLocalBean) --> Ejb(deployment-id=UserService) |
| INFO - Jndi(name=global/test/UserService!org.superbiz.rest.UserService) --> Ejb(deployment-id=UserService) |
| INFO - Jndi(name=global/test/UserService) --> Ejb(deployment-id=UserService) |
| INFO - Created Ejb(deployment-id=UserService, ejb-name=UserService, container=Default Stateless Container) |
| INFO - Started Ejb(deployment-id=UserService, ejb-name=UserService, container=Default Stateless Container) |
| INFO - Using readers: |
| INFO - org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a |
| INFO - org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c |
| INFO - org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c |
| INFO - org.apache.cxf.jaxrs.provider.SourceProvider@66629f63 |
| INFO - org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575 |
| INFO - org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c |
| INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9 |
| INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245 |
| INFO - org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8 |
| INFO - org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c |
| INFO - org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9 |
| INFO - Using writers: |
| INFO - org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@591e58fa |
| INFO - org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@3954d008 |
| INFO - org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8 |
| INFO - org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575 |
| INFO - org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a |
| INFO - org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c |
| INFO - org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c |
| INFO - org.apache.cxf.jaxrs.provider.SourceProvider@66629f63 |
| INFO - org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c |
| INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9 |
| INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245 |
| INFO - org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c |
| INFO - org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9 |
| INFO - Using exception mappers: |
| INFO - org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@403132fc |
| INFO - org.apache.openejb.server.cxf.rs.EJBExceptionMapper@32cb636e |
| INFO - org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@71c5b236 |
| INFO - org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@2cab9998 |
| INFO - REST Application: http://127.0.0.1:4204/test/api -> org.superbiz.JAXRSApplication@285d851a |
| INFO - Service URI: http://127.0.0.1:4204/test/api/users -> EJB org.superbiz.rest.UserService |
| INFO - GET http://127.0.0.1:4204/test/api/users -> List<User> users() |
| INFO - POST http://127.0.0.1:4204/test/api/users -> User addUser(User) |
| INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest) |
| INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest |
| INFO - Stopping network services |
| INFO - Stopping server services |
| INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@7823a2f9 |
| INFO - Succeeded in installing singleton service |
| INFO - Cannot find the configuration file [conf/openejb.xml]. Will attempt to create one for the beans deployed. |
| INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) |
| INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) |
| INFO - Creating TransactionManager(id=Default Transaction Manager) |
| INFO - Creating SecurityService(id=Default Security Service) |
| INFO - Initializing network services |
| INFO - Creating ServerService(id=cxf-rs) |
| INFO - Creating ServerService(id=httpejbd) |
| INFO - Created ServicePool 'httpejbd' with (10) core threads, limited to (200) threads with a queue of (9) |
| INFO - Initializing network services |
| INFO - ** Bound Services ** |
| INFO - NAME IP PORT |
| INFO - httpejbd 127.0.0.1 4204 |
| INFO - ------- |
| INFO - Ready! |
| INFO - Configuring enterprise application: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest |
| INFO - Auto-deploying ejb UserService: EjbDeployment(deployment-id=UserService) |
| INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) |
| INFO - Auto-creating a container for bean org.superbiz.rest.UserServiceTest: Container(type=MANAGED, id=Default Managed Container) |
| INFO - Creating Container(id=Default Managed Container) |
| INFO - Using directory /tmp for stateful session passivation |
| INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container) |
| INFO - Auto-creating a container for bean UserService: Container(type=STATELESS, id=Default Stateless Container) |
| INFO - Creating Container(id=Default Stateless Container) |
| INFO - Enterprise application "/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest" loaded. |
| INFO - Creating dedicated application classloader for UserServiceTest |
| INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest |
| INFO - Jndi(name=UserServiceLocalBean) --> Ejb(deployment-id=UserService) |
| INFO - Jndi(name=global/test/UserService!org.superbiz.rest.UserService) --> Ejb(deployment-id=UserService) |
| INFO - Jndi(name=global/test/UserService) --> Ejb(deployment-id=UserService) |
| INFO - Created Ejb(deployment-id=UserService, ejb-name=UserService, container=Default Stateless Container) |
| INFO - Started Ejb(deployment-id=UserService, ejb-name=UserService, container=Default Stateless Container) |
| INFO - Using readers: |
| INFO - org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe |
| INFO - org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6 |
| INFO - org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36 |
| INFO - org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31 |
| INFO - org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6 |
| INFO - org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7 |
| INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9 |
| INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245 |
| INFO - org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65 |
| INFO - org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82 |
| INFO - org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0 |
| INFO - Using writers: |
| INFO - org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@66d23e4a |
| INFO - org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@36ac8a63 |
| INFO - org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65 |
| INFO - org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6 |
| INFO - org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe |
| INFO - org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6 |
| INFO - org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36 |
| INFO - org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31 |
| INFO - org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7 |
| INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9 |
| INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245 |
| INFO - org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82 |
| INFO - org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0 |
| INFO - Using exception mappers: |
| INFO - org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@4d9d1b69 |
| INFO - org.apache.openejb.server.cxf.rs.EJBExceptionMapper@5305c37d |
| INFO - org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@52c8295b |
| INFO - org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@251f7d26 |
| INFO - REST Application: http://127.0.0.1:4204/test/api -> org.superbiz.JAXRSApplication@77b21474 |
| INFO - Service URI: http://127.0.0.1:4204/test/api/users -> EJB org.superbiz.rest.UserService |
| INFO - GET http://127.0.0.1:4204/test/api/users -> List<User> users() |
| INFO - POST http://127.0.0.1:4204/test/api/users -> User addUser(User) |
| INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest) |
| INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest |
| INFO - Stopping network services |
| INFO - Stopping server services |
| Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.31 sec |
| |
| Results : |
| |
| Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 |
| |
| ---- |
| |
| === Inside the jar |
| |
| javaee-api:8.0 brings in all the dependencies needed to spin up a |
| working REST application. |
| |
| If we look at the jar built by maven, we’ll see the application itself |
| is quite small: |
| |
| [source,java] |
| ---- |
| $ jar tvf target/jsonb-custom-serializer-8.0.0-SNAPSHOT.war |
| 0 Sat Dec 29 19:10:44 CET 2018 META-INF/ |
| 134 Sat Dec 29 19:10:42 CET 2018 META-INF/MANIFEST.MF |
| 0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/ |
| 0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/ |
| 0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/ |
| 0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/ |
| 0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/model/ |
| 0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/rest/ |
| 790 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/model/Address.class |
| 2093 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/model/User.class |
| 2063 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/UserDeserializer.class |
| 402 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/JAXRSApplication.class |
| 1461 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/AddressSerializer.class |
| 1498 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/rest/UserService.class |
| 1549 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/JSONBConfiguration.class |
| 1241 Sat Dec 29 17:52:48 CET 2018 WEB-INF/web.xml |
| 0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/ |
| 0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/org.superbiz/ |
| 0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/ |
| 1811 Sat Dec 29 17:53:36 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/pom.xml |
| 132 Sat Dec 29 19:10:42 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/pom.properties |
| ---- |
| |
| This single jar could be deployed any any compliant Java EE |
| implementation. In TomEE you’d simply place it in the |
| `tomee.home/webapps/` directory. |