سؤال

تقول مواصفات 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 على مواصفات للنشر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top