어노테이션 만 사용하여 (web.xml 없음) JAX-RS 애플리케이션을 설정하는 방법은 무엇입니까?


80

어노테이션 만 사용하여 JAX-RS 애플리케이션을 설정할 수 있습니까? (Servlet 3.0 및 JAX-RS Jersey 1.1.0 사용)

나는 시도했지만 운이 없었다. 일부 사용 web.xml이 필요한 것 같습니다.


구성 A (작동하지만 web.xml 구성이 있음)

web.xml

   ...
   <servlet>
      <servlet-name>org.foo.rest.MyApplication</servlet-name>
   </servlet>
   <servlet-mapping>
       <servlet-name>org.foo.rest.MyApplication</servlet-name>
       <url-pattern>/*</url-pattern>
   </servlet-mapping>
   ...

자바

@ApplicationPath("/")
public class MyApplication extends Application {
    ...
}

구성 B (작동하지 않음, 예외 발생)

@ApplicationPath("/")
@WebServlet("/*") // <-- 
public class MyApplication extends Application {
    ...
}

후자는 응용 프로그램이 Servlet의 하위 클래스가 될 것이라고 주장하는 것 같습니다 (예외가 추측을 남기지 않음).

java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet

질문

  1. web.xml 정의가 작동했지만 주석이 작동하지 않은 이유는 무엇입니까? 차이점이 뭐야?

  2. 예를 들어 web.xml이없는 JAX-RS 애플리케이션을 사용하는 것과 같이 작동하도록하는 방법이 있습니까?


1
NetBeans로 시도 할 수 있다면 RESTFul 웹 서비스를 만드는 마법사가 있습니다. 당신이하려는 것은 ver 6.8에서이 마법사가하는 일인 것 같습니다. 저는 7.0.1을 사용하고 있으며 새로운 접근 방식은 더 간단하지만 com.sun.jersey.spi.container.servlet.ServletContainer라는 목적으로 단일 서블릿을 사용하지만 web.xml에 정의되어 있습니다
perissf

답변:


168

** TOMCAT 또는 JETTY를 사용하는 경우 읽으십시오! **

허용되는 답변 작동하지만 Webapp이 Glassfish 또는 Wildfly와 같은 앱 서버 및 TomEE와 같은 EE 확장이있는 서블릿 컨테이너에 배포 된 경우에만 작동합니다. 그것은 하지 않습니다 내가 여기 사용 하시겠습니까 솔루션을 찾고 대부분의 사람들이야 톰캣 같은 표준 서블릿 컨테이너에서 작동합니다.

표준 Tomcat 설치 (또는 다른 서블릿 컨테이너)를 사용하는 경우 Tomcat에 REST 구현이 포함되어 있지 않으므로 REST 구현을 포함해야합니다. Maven을 사용하는 경우 dependencies섹션에 다음 을 추가 하십시오.

<dependencies>
  <dependency>
    <groupId>org.glassfish.jersey.bundles</groupId>
    <artifactId>jaxrs-ri</artifactId>
    <version>2.13</version>
  </dependency>
  ...
</dependencies>

그런 다음 프로젝트에 애플리케이션 구성 클래스를 추가하기 만하면됩니다. 나머지 서비스에 대한 컨텍스트 경로를 설정하는 것 외에 특별한 구성이 필요하지 않은 경우 클래스가 비어있을 수 있습니다. 이 클래스가 추가되면 다음에서 아무것도 구성 할 필요가 없습니다 web.xml.

package com.domain.mypackage;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest") // set the path to REST web services
public class ApplicationConfig extends Application {}

그런 다음 Java 클래스의 표준 JAX-RS 어노테이션을 사용하여 웹 서비스 선언이 간단합니다.

package com.domain.mypackage;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.Path;

// It's good practice to include a version number in the path so you can have
// multiple versions deployed at once. That way consumers don't need to upgrade
// right away if things are working for them.
@Path("calc/1.0")
public class CalculatorV1_0 {
  @GET
  @Consumes("text/plain")
  @Produces("text/plain")
  @Path("addTwoNumbers")
  public String add(@MatrixParam("firstNumber") int n1, @MatrixParam("secondNumber") int n2) {
    return String.valueOf(n1 + n2);
  }
}

이것 만 있으면됩니다. Tomcat 설치가 포트 8080에서 로컬로 실행되고 WAR 파일을 컨텍스트에 배포하는 경우 다음으로 myContext이동합니다.

http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3

... 예상 된 결과를 생성해야합니다 (5).


6
@JavaDude-Maven web.xml이 존재하지 않더라도 WAR 파일을 빌드하도록 구성해야합니다 . 에서 pom.xml"빌드> 플러그인"추가 (아직없는 경우) 미만 : <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.3</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin>.
Alvin Thompson

6
@JavaDude-중요한 부분은 <failOnMissingWebXml>false</fai‌​lOnMissingWebXml>옵션입니다.
Alvin Thompson

3
@JavaDude-그렇지 않다면 확장 Application하고 @ApplicationPath주석을 추가 하는 클래스를 만들지 않았을 것입니다. 클래스는 비어있을 수 있지만 거기에 있어야합니다.
Alvin Thompson

3
jersey-container-servlet전체 jaxrs-ri종속성을 가져 오지 않고을 추가하는 것으로 충분합니다 . 예를 들어 제 경우에는 'org.glassfish.jersey.core:jersey-server:2.18'+ 였습니다 'org.glassfish.jersey.containers:jersey-container-servlet:2.18'.
leveluptor

3
질문에 "java-ee"로 명확하게 태그가 지정되어 있기 때문에 jee 환경을 다루지 않는 답변을 제공하고 찬성하는 것에 대한 모호한 내용을 이해하지 못합니다. -1
Jan Galinski 2015 년

51

내가해야 할 일은 이것 뿐인 것 같습니다 (서블릿 3.0 이상)

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/*")
public class MyApplication extends Application {
    ...
}

그리고 web.xml 구성이 분명히 필요하지 않았습니다 (Tomcat 7에서 시도)


1
이것이 어떻게 작동하는지 이해하지 못합니다. 다른 구성없이 주석 만 사용할 수 있습니까? 나는 이렇게 시도했지만 여전히 작동하지 않습니다 ...
Filipe

2
@Filipe : Tomcat 또는 다른 서블릿 컨테이너를 사용하고 있다고 생각합니다. 이것은 실제로 Tomcat과 같은 서블릿 컨테이너에서 작동하지 않습니다 .Glassfish 또는 Wildfly와 같은 앱 서버와 TomEE에서만 작동합니다. Tomcat을 사용하는 경우 아래의 (늦은) 답변을 참조하십시오.
Alvin Thompson

8
이 답변은 Tomcat 또는 Jetty에서 작동하지 않습니다! 해당 (및 기타) 서블릿 컨테이너에서 작동하는 것을 얻으려면 내 대답을 참조하십시오.
Alvin Thompson

1
구현에 따라 web.xml 필요하지만 빈 XML이면 충분합니다. 참조 docs.jboss.org/resteasy/docs/3.0.9.Final/userguide/html_single/...
벤자민 마우어

이것은 WebSphere Liberty에서 작동하지만 WebSphere 8.x 및 9.0 Classic에서는 작동하지 않습니다.
Archimedes Trajano

15

JAX-RS : RESTful 웹 서비스 용 Java ™ API 사양의 2 장 에서는 Servlet 환경에서 JAX-RS 애플리케이션의 게시 프로세스를 설명합니다 ( 사양의 섹션 2.3.2 Servlet ).

Servlet 3 환경 만 권장됩니다 (섹션 2.3.2 Servlet, 페이지 6) :

구현시 Servlet 3 프레임 워크 플러그 가능성 메커니즘을 지원하여 컨테이너 간의 이식성을 활성화하고 컨테이너에서 제공하는 클래스 스캔 기능을 사용할 수 있도록하는 것이 좋습니다.

간단히 말해서 no-web.xml 접근 방식을 사용하려는 경우 javax.ws.rs.ApplicationPath 주석으로 RESTful 서비스 리소스를 등록 하는 javax.ws.rs.core.Application 의 사용자 지정 구현을 통해 가능합니다 .

@ApplicationPath("/rest")

당신은 기사 읽기님께 추천 뉴저지에 대해 구체적으로 질문하지만 JAX-RS 및 WebSphere 8.5 자유 프로필에 구현하여 RESTful 서비스 I가 노 web.xml을 게시 과정을 설명하는 는 WebSphere 자유 프로파일 의 구현으로 아파치 윙크와을 ( JAX-RS).


1
감사합니다!, 저를 미치게 만드는 또 다른 질문이 있습니다. 루트 (예 : @ApplicationPath ( "/ *"))에 경로를두고 주석 만 사용하여 JSP를 제공하는 방법이 있습니까? (web.xml 구성으로도 만들 수 없었습니다)-질문은 여기에 있습니다 : stackoverflow.com/questions/10874188/… , JAX-RS를 꽤 잘 알고있는 것 같으므로 살펴 보시겠습니까? :) 아마도 내가 놓친 것을 보게 될 것입니다 ... 감사합니다!
Eran Medan

모르겠어요. 요청을 처리하기 위해 리소스를 해결하는 프로세스가 URL 패턴과 정확히 일치하는 것이므로 추가 구성없이 작동해야한다는 직감이 있습니다. 내가보고 응답 할게. 지식을 넓히도록 격려해 주셔서 감사합니다! :-)
Jacek Laskowski 2013

사용 임 @ApplicationPath("")제이보스 EAP 7. (웹 애플리케이션 컨텍스트 루트에 상대적) 루트에 내 REST 서비스를 가지고 나는 어느 쪽도 없다 beans.xml아니다 web.xml.
Julien Kronegg

7

pom.xml에 올바른 종속성을 설정해야합니다.

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
    </dependency>

자세한 내용은 여기 : jax-rs의 시작 예제


ResourceConfig / Application을 사용한 경우 web.xml을 삭제할 수 있습니까?
BAE

예,하지만 이것을 pom.xml에 추가해야합니다. i fusnig mave :<failOnMissingWebXml>
ACV

감사. 그러나 web.xml은 할 수 있지만 ResourceConfig는 할 수없는 것이 있습니까?
BAE

아니요, 서블릿 사양 3.0 web.xml이 더 이상 필요하지 않기 때문에 생각합니다. 그러나 때로는 변경하려는 경우 재 컴파일이 필요하지 않으므로 web.xml을 사용하는 것이 더 편리합니다.
ACV

Maven을 사용하지 않으면 어떻게 될까요? 내 프로젝트가 지금 너무 커서 다시 전환 할 수 없습니다.
TheRealChx101 dec

1

이전에 언급 한 종속성이 저에게 효과적이지 않았습니다. Jersey 사용 설명서에서 :

Jersey는 두 개의 Servlet 모듈을 제공합니다. 첫 번째 모듈은 핵심 Servlet 통합 지원을 제공하는 Jersey 핵심 Servlet 모듈이며 모든 Servlet 2.5 이상 컨테이너에 필요합니다.

<dependency>
 <groupId>org.glassfish.jersey.containers</groupId>
 <artifactId>jersey-container-servlet-core</artifactId>
</dependency>

추가 Servlet 3.x 배치 모드 및 비동기 JAX-RS 자원 프로그래밍 모델을 지원하려면 추가 Jersey 모듈이 필요합니다.

<dependency>
 <groupId>org.glassfish.jersey.containers</groupId>
 <artifactId>jersey-container-servlet</artifactId>
</dependency>

jersey-container-servlet 모듈은 jersey-container-servlet-core 모듈에 의존하므로 사용시 jersey-container-servlet-core 종속성을 명시 적으로 선언 할 필요가 없습니다.

https://jersey.github.io/documentation/latest/deployment.html#deployment.servlet.3


0

@ Eran-Medan이 지적했듯이 JBoss EAP 7.1 (웹 응용 프로그램이 없어서 서블릿이 없어서 EJB 3.2 프로젝트에서 수행했습니다) 나는 "value"속성을 추가해야했습니다. 값 속성이 필요합니다.

이것은 나를 위해 일했습니다.

    @ApplicationPath(value="/*")
        public class MyApplication extends Application {

            private Set singletons = new HashSet();

            public MyApplication() {
                singletons.add(new MyService());
            }

            ...
    }

스택 추적

    Caused by: java.lang.annotation.IncompleteAnnotationException: javax.ws.rs.ApplicationPath missing element value
        at sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:80)
        at com.sun.proxy.$Proxy141.value(Unknown Source)
        ... 21 more
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.