package org.superbiz.rest;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.NamedQueries;
import jakarta.persistence.NamedQuery;
import jakarta.xml.bind.annotation.XmlRootElement;
@Entity
@NamedQueries({
@NamedQuery(name = "user.list", query = "select u from User u")
}
REST on EJB
Help us document this example! Click the blue pencil icon in the upper right to edit this page.
User
UserService
package org.superbiz.rest;
import jakarta.ejb.Lock;
import jakarta.ejb.LockType;
import jakarta.ejb.Singleton;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.DefaultValue;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;
/**
* Outputs are copied because of the enhancement of OpenJPA.
*
*/
@Singleton
@Lock(LockType.WRITE)
@Path("/user")
@Produces(MediaType.APPLICATION_XML)
public class UserService {
@PersistenceContext
private EntityManager em;
@Path("/create")
@PUT
public User create(@QueryParam("name") String name,
@QueryParam("pwd") String pwd,
@QueryParam("mail") String mail) {
User user = new User();
user.setFullname(name);
user.setPassword(pwd);
user.setEmail(mail);
em.persist(user);
return user;
}
@Path("/list")
@GET
public List<User> list(@QueryParam("first") @DefaultValue("0") int first,
@QueryParam("max") @DefaultValue("20") int max) {
List<User> users = new ArrayList<User>();
List<User> found = em.createNamedQuery("user.list", User.class).setFirstResult(first).setMaxResults(max).getResultList();
for (User u : found) {
users.add(u.copy());
}
return users;
}
@Path("/show/{id}")
@GET
public User find(@PathParam("id") long id) {
User user = em.find(User.class, id);
if (user == null) {
return null;
}
return user.copy();
}
@Path("/delete/{id}")
@DELETE
public void delete(@PathParam("id") long id) {
User user = em.find(User.class, id);
if (user != null) {
em.remove(user);
}
}
@Path("/update/{id}")
@POST
public Response update(@PathParam("id") long id,
@QueryParam("name") String name,
@QueryParam("pwd") String pwd,
@QueryParam("mail") String mail) {
User user = em.find(User.class, id);
if (user == null) {
throw new IllegalArgumentException("user id " + id + " not found");
}
user.setFullname(name);
user.setPassword(pwd);
user.setEmail(mail);
em.merge(user);
return Response.ok(user.copy()).build();
}
}
persistence.xml
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="user">
<jta-data-source>My DataSource</jta-data-source>
<non-jta-data-source>My Unmanaged DataSource</non-jta-data-source>
<class>org.superbiz.rest.User</class>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
</properties>
</persistence-unit>
</persistence>
UserServiceTest
package org.superbiz.rest;
import org.apache.cxf.jaxrs.client.WebClient;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import jakarta.ejb.EJB;
import jakarta.ws.rs.core.Response;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.Unmarshaller;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
@RunWith(Arquillian.class)
public class UserServiceTest {
private static List<User> users = new ArrayList<>();
@ArquillianResource
private URL base;
@EJB
private UserService service;
@Deployment
public static WebArchive app() {
return ShrinkWrap.create(WebArchive.class)
.addClasses(User.class, UserService.class)
.addAsResource(new ClassLoaderAsset("META-INF/persistence.xml"), "META-INF/persistence.xml");
}
@Before
public void createSomeRecords() {
if (users.isEmpty()) { // the test runs inside TomEE, the records are created once for all tests
users.add(service.create("foo", "foopwd", "foo@foo.com"));
users.add(service.create("bar", "barpwd", "bar@bar.com"));
}
}
@Test
public void create() {
WebClient.create(base.toExternalForm())
.path("/user/create")
.query("name", "dummy")
.query("pwd", "unbreakable")
.query("mail", "foo@bar.fr")
.put("{}");
List<User> list = service.list(0, 100);
for (User u : list) {
if (!users.contains(u)) {
service.delete(u.getId());
return;
}
}
fail("user was not added");
}
@Test
public void delete() throws Exception {
User user = service.create("todelete", "dontforget", "delete@me.com");
WebClient.create(base.toExternalForm()).path("/user/delete/" + user.getId()).delete();
user = service.find(user.getId());
assertNull(user);
}
@Test
public void show() {
User user = WebClient.create(base.toExternalForm())
.path("/user/show/" + users.iterator().next().getId())
.get(User.class);
assertEquals("foo", user.getFullname());
assertEquals("foopwd", user.getPassword());
assertEquals("foo@foo.com", user.getEmail());
}
@Test
public void list() throws Exception {
String users = WebClient.create(base.toExternalForm())
.path("/user/list")
.get(String.class);
assertEquals(users,
inline("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<users>" +
" <user>" +
" <email>bar@bar.com</email>" +
" <fullname>bar</fullname>" +
" <id>2</id>" +
" <password>barpwd</password>" +
" </user>" +
" <user>" +
" <email>foo@foo.com</email>" +
" <fullname>foo</fullname>" +
" <id>1</id>" +
" <password>foopwd</password>" +
" </user>" +
"</users>"), inline(users)
);
}
private static String inline(String s) {
return s.replace(System.getProperty("line.separator"), "").replace("\n", "")
.replace(" ", "").replace("\t", "");
}
@Test
public void update() throws Exception {
User created = service.create("name", "pwd", "mail");
Response response = WebClient.create(base.toExternalForm())
.path("/user/update/" + created.getId())
.query("name", "corrected")
.query("pwd", "userpwd")
.query("mail", "it@is.ok")
.post(null);
JAXBContext ctx = JAXBContext.newInstance(User.class);
Unmarshaller unmarshaller = ctx.createUnmarshaller();
User modified = (User) unmarshaller.unmarshal(InputStream.class.cast(response.getEntity()));
assertEquals("corrected", modified.getFullname());
assertEquals("userpwd", modified.getPassword());
assertEquals("it@is.ok", modified.getEmail());
service.delete(created.getId());
}
}
Running
Running org.superbiz.rest.UserServiceTest
INFO: Starting TomEE from: /tmp/arquillian-apache-tomee-23442
INFO: Starting Servlet engine: [Apache Tomcat/11.0.25]
INFO: Starting ProtocolHandler ["http-nio-52948"]
INFO: Configuring enterprise application: /path/to/tomee/examples/rest-on-ejb/target/tomee-embedded/0/83a03b24-3a21-4e2c-a0c7-4f869195c85e
INFO: Configuring PersistenceUnit(name=user)
INFO: Auto-creating a Resource with id 'Default JDBC Database' of type 'DataSource' for 'user'.
INFO: Auto-creating a Resource with id 'Default Unmanaged JDBC Database' of type 'DataSource' for 'user'.
INFO: Enterprise application "/path/to/tomee/examples/rest-on-ejb/target/tomee-embedded/0/83a03b24-3a21-4e2c-a0c7-4f869195c85e" loaded.
INFO: PersistenceUnit(name=user, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 15ms
INFO: Deployed Application(path=/path/to/tomee/examples/rest-on-ejb/target/tomee-embedded/0/83a03b24-3a21-4e2c-a0c7-4f869195c85e)
INFO: REST Application: http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/ -> org.apache.openejb.server.rest.InternalApplication
INFO: Service URI: http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user -> EJB org.superbiz.rest.UserService
INFO: DELETE http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user/delete/{id} -> void delete(long)
INFO: GET http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user/list -> List<User> list(int, int)
INFO: GET http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user/show/{id} -> User find(long)
INFO: POST http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user/update/{id} -> Response update(long, String, String, String)
INFO: PUT http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user/create -> User create(String, String, String)
INFO: Undeploying app: /path/to/tomee/examples/rest-on-ejb/target/tomee-embedded/0/83a03b24-3a21-4e2c-a0c7-4f869195c85e
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.351 s -- in org.superbiz.rest.UserServiceTest
Results:
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0