From 33baf66b7bcd61e9a2458f6f3bf9c3f93326cb32 Mon Sep 17 00:00:00 2001 From: "yoann.maurel" Date: Thu, 17 Mar 2022 17:25:39 +0100 Subject: [PATCH] Jaxb > Jakarta, Java 8 > Java 11+, Tomcat 9 > Tomcat 10, Jersey 2 > Jersey 3, fix java errors when using java 11+ due to the improper configuration of modules in jersey<2.7. This is a huge change to dependencies and the import. Replace javax imports by jakarta imports and fix moxy xml dependencies. Please pay attention to the imports since old javax dependencies will explicitly cause Class Not found or worse : silently fail --- pom.xml | 79 +++++++++++------ .../java/fr/istic/chat/message/Message.java | 41 +++++++++ .../fr/istic/chat/message/MessageList.java | 86 +++++++++++++++++++ src/main/java/fr/istic/rest/Hello.java | 14 +-- .../java/fr/istic/rest/MessageRessource.java | 26 ++++++ .../java/fr/istic/servlet/HelloServlet.java | 22 ++--- src/main/java/test/TestApi.java | 42 +++++++++ src/main/webapp/WEB-INF/web.xml | 5 +- 8 files changed, 263 insertions(+), 52 deletions(-) create mode 100644 src/main/java/fr/istic/chat/message/Message.java create mode 100644 src/main/java/fr/istic/chat/message/MessageList.java create mode 100644 src/main/java/fr/istic/rest/MessageRessource.java create mode 100644 src/main/java/test/TestApi.java diff --git a/pom.xml b/pom.xml index dffeda1..607b42f 100644 --- a/pom.xml +++ b/pom.xml @@ -9,10 +9,11 @@ UTF-8 - 8 - 8 - 2.28 - 2.9.6 + 11 + 11 + 3.0.4 + 20210307 + 5.0.0 @@ -31,11 +32,12 @@ + + - javax.servlet - javax.servlet-api - 4.0.1 - provided + jakarta.servlet + jakarta.servlet-api + ${servlet.api.version} @@ -67,30 +69,51 @@ org.glassfish.jersey.media jersey-media-sse + + org.glassfish.jersey.media + jersey-media-jaxb + + + + + + + org.json + json + ${org.json.version} + - javax.xml.bind - jaxb-api - 2.2.11 - - - com.sun.xml.bind - jaxb-core - 2.2.11 - - - com.sun.xml.bind - jaxb-impl - 2.2.11 - - - javax.activation - activation - 1.1.1 - - + jakarta.xml.bind + jakarta.xml.bind-api + 3.0.1 + + + com.sun.xml.bind + jaxb-impl + 3.0.1 + runtime + + + + + org.eclipse.persistence + org.eclipse.persistence.moxy + 3.0.0 + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.3.1 + + + + \ No newline at end of file diff --git a/src/main/java/fr/istic/chat/message/Message.java b/src/main/java/fr/istic/chat/message/Message.java new file mode 100644 index 0000000..2adf067 --- /dev/null +++ b/src/main/java/fr/istic/chat/message/Message.java @@ -0,0 +1,41 @@ +package fr.istic.chat.message; + +import jakarta.xml.bind.annotation.XmlRootElement; + + +public class Message { + + private Long id; + private String content; + private String date; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + @Override + public String toString() { + return id + ":" + date + ">" + content; + } + +} \ No newline at end of file diff --git a/src/main/java/fr/istic/chat/message/MessageList.java b/src/main/java/fr/istic/chat/message/MessageList.java new file mode 100644 index 0000000..dfd1b2e --- /dev/null +++ b/src/main/java/fr/istic/chat/message/MessageList.java @@ -0,0 +1,86 @@ +package fr.istic.chat.message; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MessageList { + + private static MessageList INSTANCE = new MessageList(); + + public static final MessageList getInstance() { + return INSTANCE; + } + + private static long CURRENT_ID = 0; + + private synchronized static Long getNextID() { + return CURRENT_ID++; + } + + public synchronized static Long getHighestID() { + return CURRENT_ID; + } + + /* L'utilisation d'un bloc static est une très mauvaise idée de façon générale. + * Ce code est appelé au chargement de la classe par le Classloader + * On l'utilise ici pour remplir les messages : + */ + static { + + Message m = new Message(); + m.setContent("ceci est un test"); + INSTANCE.createMessage(m); + + m = new Message(); + m.setContent("test 2"); + INSTANCE.createMessage(m); + + m = new Message(); + m.setContent("test 3"); + INSTANCE.createMessage(m); + + } + + private Map messagesMap = new HashMap(); + + public synchronized Message createMessage(Message message) { + message.setId(getNextID()); + message.setDate(new Date().toString()); + messagesMap.put(message.getId(), message); + return message; + } + + public synchronized Message getMessage(Long id) { + return messagesMap.get(id); + } + + public synchronized void delMessage(Long id) { + messagesMap.remove(id); + } + + public synchronized List getMessages() { + return new ArrayList(messagesMap.values()); + } + + public synchronized List getMessagesBetween(Long id1, Long id2) { + List messages = new ArrayList(); + for (Long i = id1; i <= id2; i++) { + messages.add(messagesMap.get(i)); + } + return messages; + } + + public synchronized List getMessagesAfter(Long id1) { + List messages = new ArrayList(); + for (Long i = id1; i <= getHighestID(); i++) { + if (messagesMap.containsKey(i)) { + messages.add(messagesMap.get(i)); + } + } + return messages; + } + +} \ No newline at end of file diff --git a/src/main/java/fr/istic/rest/Hello.java b/src/main/java/fr/istic/rest/Hello.java index 357ee9d..7c08fd0 100644 --- a/src/main/java/fr/istic/rest/Hello.java +++ b/src/main/java/fr/istic/rest/Hello.java @@ -1,11 +1,11 @@ package fr.istic.rest; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.xml.bind.annotation.XmlRootElement; @Path("/hello") public class Hello { @@ -18,7 +18,7 @@ public class Hello { @Path("/{name}") @GET - @Produces(MediaType.APPLICATION_JSON) + @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) public Message getDescription(@PathParam("name") String name) { Message m = new Message(); m.name = name; diff --git a/src/main/java/fr/istic/rest/MessageRessource.java b/src/main/java/fr/istic/rest/MessageRessource.java new file mode 100644 index 0000000..120e5d1 --- /dev/null +++ b/src/main/java/fr/istic/rest/MessageRessource.java @@ -0,0 +1,26 @@ +package fr.istic.rest; + +import java.util.List; + +import fr.istic.chat.message.Message; +import fr.istic.chat.message.MessageList; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.xml.bind.JAXBElement; + +public class MessageRessource { + + @Path("/after/{id}") + @GET + @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) + public List getMessagesAfter(@PathParam("id") Long id){ + System.out.println("message after" + id); + return MessageList.getInstance().getMessagesAfter(id); + } + +} diff --git a/src/main/java/fr/istic/servlet/HelloServlet.java b/src/main/java/fr/istic/servlet/HelloServlet.java index 8247cdd..04056cc 100644 --- a/src/main/java/fr/istic/servlet/HelloServlet.java +++ b/src/main/java/fr/istic/servlet/HelloServlet.java @@ -3,15 +3,15 @@ package fr.istic.servlet; import java.io.IOException; import java.io.PrintWriter; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.core.MediaType; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.core.MediaType; +import jakarta.xml.bind.annotation.XmlRootElement; @WebServlet("/client") public class HelloServlet extends HttpServlet { @@ -30,10 +30,6 @@ public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - // Ceci n'est utile que pour JAXB 2.3.1 et disparaitra plus tard : - System.setProperty("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", - "true"); - PrintWriter out = resp.getWriter(); resp.setContentType("text/plain"); try { diff --git a/src/main/java/test/TestApi.java b/src/main/java/test/TestApi.java new file mode 100644 index 0000000..661e040 --- /dev/null +++ b/src/main/java/test/TestApi.java @@ -0,0 +1,42 @@ +package test; + + +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.xml.bind.annotation.XmlRootElement; + +public class TestApi { + + //TODO : Adapter l'URL en fonction de votre resource : + public static final String URL = "http://localhost:8080/pr.tp.services/api"; + + @XmlRootElement(name="message") + public static class ChatMessage { + public Long id; + public String content; + public String date; + @Override + public String toString() { + return id + ":" + content+ " at "+ date; + } + } + + public static void main(String[] args) { + Client client = ClientBuilder.newClient(); + + //Post a message : + ChatMessage m = new ChatMessage(); + m.content="test"; + Response response = client.target(URL).path("messages").request(MediaType.APPLICATION_JSON_TYPE).post(Entity.entity(m, MediaType.APPLICATION_XML)); + System.out.println("Response "+ response.getStatus()); + + //Get all the messages + ChatMessage[] messages = client.target(URL).path("messages").request(MediaType.APPLICATION_JSON_TYPE).get(ChatMessage[].class); + for (ChatMessage chatMessage : messages) { + System.out.println(chatMessage); + } + } +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 6905f59..3a78c27 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -1,10 +1,7 @@ - + Jersey Web Application org.glassfish.jersey.servlet.ServletContainer