كيفية نشر تطبيق Jax-RS؟
-
20-09-2019 - |
سؤال
تقول مواصفات Jax-RS 1.1 في الصفحة 6:
إذا لم تكن هناك فئة فرعية للتطبيق ، فيجب تسمية Servlet المضافة:
javax.ws.rs.core.Application
ما هو servlet المضافة؟ هل يمكن أن يكون خدمة تعسفية؟
إذا كانت الفئة الفرعية للتطبيق موجودة ، فهناك بالفعل محدد Servlet يحتوي على معلمة تهيئة Servlet المسمى:
javax.ws.rs.Application
مرة أخرى ، ما هو "servlet" هنا؟
إذا كانت الفئة الفرعية للتطبيق موجودة لا يتم التعامل معها بواسطة servlet موجودة ، فيجب تسمية servlet التي تمت إضافتها بواسطة حاوية الحاوية مع الاسم المؤهل بالكامل للفئة الفرعية للتطبيق.
هل تعني "servlet الذي تمت إضافته بواسطة حاوية الحاوية" أن servlets تمت إضافة تلقائيًا؟ كيف سيبدو التكوين؟
في الوقت الحالي ، لا أستخدم فئة تطبيق ولا web.xml ويعمل (مع Glassfish 3.1). هل تتطلب آلية النشر هذه فحصًا كاملًا للمسار ، والذي يمكن أن يكون بطيئًا مع المكتبات الكبيرة؟
كيفية النشر على حاوية servlet؟
هناك عدد مربك من خيارات التكوين الموجودة في الويب. انظر الى هذا مثال مع معاملات السياق في web.xml (لا يعمل بالنسبة لي!). ما هي الطريقة المفضلة لنشر تطبيق Jax-RS؟
المحلول
هناك عدد من الخيارات للنشر في حاوية Java EE 6 (بشكل أكثر تحديدًا تطبيق Servlet 3.0):
أبسط:
<?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_3_0.xsd" version="3.0">
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
ثم كل @Path
و @Provider
ستتوفر الفصول الموجودة في تطبيق الويب الخاص بك في تطبيق Jax-RS "الافتراضي" "/rest/*"
.
إذا كان لديك فئة واحدة أو أكثر تمتد javax.ws.rs.core.Application
, ، يمكنك تحديد مثل ذلك:
<?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_3_0.xsd" version="3.0">
<servlet>
<servlet-name>com.example.jaxrs.MyApplication</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>com.example.jaxrs.MyApplication</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
قد ترغب في القيام بما سبق في حال كنت ترغب فقط في إعادة مجموعات محددة من @Path
/@Provider
الفصول الدراسية على عنوان URL (لذلك يمكن أن يكون لديك myapplication2 ثانية مع نمط عنوان URL مختلف أعلاه).
يمكنك أيضًا تخطي الكل web.xml
تماما وتوضيح الخاص بك فقط MyApplication
فئة wih @ApplicationPath
والتي سوف تكون بمثابة نمط عنوان URL. أود أن أوصي بالحفاظ على web.xml
في أي حال لأنه من المحتمل أن تضطر إلى إضافة معلومات أخرى حول تطبيق الويب هناك على أي حال.
إذا كنت تتساءل أين servlet-class
يأتي من ذلك تلقائيًا من قبل البيئة. يمكنك الحصول على فكرة من خلال النظر إلى Servlet 3.0 ServletContext
.
نصائح أخرى
مع كان 8.5 ، أقوم بتغيير web.xml لإضافة:
<servlet>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.tada.rest.RestApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
تبدو راكبي مثل:
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class RestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> sets = new HashSet<Class<?>>();
sets.add(RestService.class);
return sets;
}
}
تبدو خصيتي
@Path("/tada")
public class RestService {
@GET
public String getSomething() {
return "tada";
}
}
وأضيف في pom.xml التبعية:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
مع servlet3.0 ، اتبع هذا. هذا يعمل بالنسبة لي.
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>your.restsrv.config.RESTConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<enabled>true</enabled>
<async-supported>false</async-supported>
</servlet>
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
كما قلت في التعليق أعلاه ، كل هذا يتوقف على الإطار الذي تريد استخدامه.
http://syrupsucker.blogspot.com/2008/10/deploying-jersey-in-tomcat-60.html لجيرسيhttp://syrupsucker.blogspot.com/2008/10/deploying-resteasy-in-tomcat-60.html للباقي
على حد علمي ، لا يحتوي Jax-RS على مواصفات للنشر.