Инъекционные объекты на классы сервлета с JAX-RS
-
13-12-2019 - |
Вопрос
Я довольно новых для всего этого сервлета, поэтому, пожалуйста, исправьте меня, если я смешу или использую неправильные / запутанные условия для вещей. Однако я пингу в блоге Ping Server в Java, используя JAX-RS (Джерси), и я сталкиваюсь с проблемой, где у меня есть один класс сервлета, который принимает вход в отдохнуть, и другой класс Servlet, который перечислены тот же контент.
прямо сейчас они делятся своими объектами через класс, который выглядит так:
public class BlogPingUtils {
private static final String LIST_OF_CHANGES = "listOfChanges";
public static List<PingInfo> getListOfChanges(ServletContext context) {
List<PingInfo> listOfChanges = (List<PingInfo>)context.getAttribute(LIST_OF_CHANGES);
if(listOfChanges == null) listOfChanges = new ArrayList<PingInfo>();
return listOfChanges;
}
public static void setListOfChanges(ServletContext context, List<PingInfo> listOfChanges) {
context.setAttribute(LIST_OF_CHANGES, listOfChanges);
}
}
.
Это работает в небольшой среде разработки, но она чувствует себя грязной, и, вероятно, не будет работать в тяжелой производственной среде из-за вопросов параллелизма и таких. Также это не очень гибко. Я хотел бы сделать, это иметь интерфейс, который будет иметь методы чтения и записи данных. Тогда я бы ввел объект класса, который реализует этот интерфейс в этих двух сервлетах, чтобы они на самом деле используют один и тот же объект для взаимодействия с данными. Затем он будет поддерживаться синхронизированным списком или транзакциями базы данных или что-то в этом роде.
Что будет предпочтительным способом сделать это? Является ли это возможным? My web.xml сейчас очень просто и выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<display-name>Blog Ping</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.vrutberg.blogping</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
. Решение
, а не статический класс, я бы разработал интерфейс с вашими геттерс и загадателями, чем создать класс реализации.
Я бы тогда зарегистрировал Singleton (или Pool в зависимости от ваших потребностей) класса реализации с помощью потокового центрального хранилища, видимого как сервлеткой, такими как jndi.
Серлеты запрашивают центральный репозиторий и «лить» на интерфейс.