2013-08-11 32 views
5

Tôi đang cố gắng chạy dịch vụ REST của Jersey 2.1 trên JBoss 7.1 AS. Tôi nhận được NoSuchMethodError: Lỗi javax.ws.rs.core.Application.getProperties trong triển khai:Jersey 2.1 + JBoss 7.1 NoSuchMethodError: getProperties

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/RESTService]] (MSC service thread 1-9) StandardWrapper.Throwable: java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map; 
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:271) [jersey-server-2.1.jar:] 
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:283) [jersey-container-servlet-core-2.1.jar:] 

Trong pom.xml tôi có:

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

Và trong web.xml:

<servlet> 
    <servlet-name>RESTService</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.gatekeeper.restservice.RESTApplication</param-value> 
    </init-param> 
    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Trước đây tôi đã thử với Jersey 1.17.1 và nó hoạt động (sau khi tắt quét và mở rộng hệ thống phụ/jaxrs trong JBoss). Cho đến nay tôi đã tìm thấy một bài tương tự (nhưng với Tomcat), nơi sự kết hợp là sai javax.ws.rs.core.Application đang bị ràng buộc trong thời gian chạy, và hơn nữa lớp ràng buộc là một "cũ" (JAX- Phiên bản RS 1.1).

Bất kỳ trợ giúp nào để giải quyết vấn đề này? Tôi là người .net và tôi hoàn toàn bị mù trong java :) Cảm ơn Bartek

Trả lời

0

Trong ngắn hạn, thay đổi cấu trúc đáng kể đã được thực hiện giữa 1,17 và 2,2 của việc thực hiện Jersey. Bạn cần phải:

1) Mở rộng lớp ứng dụng của bạn từ "org.glassfish.jersey.server.ResourceConfig"

2) Thêm dòng gói trong constructor lớp ứng dụng, như vậy:

public class MyApplication extends ResourceConfig { 
     public MyApplication() { 
      packages("com.mysite.MyApplication"); 
     } 
    } 

3) Trong web.xml, bạn cần cập nhật một số địa điểm. Xem bên dưới:

<servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.mysite.MyApplication</param-value> 
    </init-param> 

4) Triển khai và giải trí.

-1

Ngoài ra, có vẻ như việc thực hành sử dụng ký tự đại diện trong nguồn java sẽ không còn được dùng nữa.

Không này)

@Path("/v1/status/*") 

Nhưng điều này)

@Path("/v1/status") 

Một cải tiến, IMHO.

0

Tôi biết chủ đề này không phải là tươi, nhưng vẫn còn, tôi chỉ nhấn vấn đề này ngày hôm qua và không có gì có vẻ làm việc.

Kịch bản của tôi rất giống: Jersey 2.23.1 Ứng dụng REST (JAX-RS 2.x) đã chạy trên tomcat và cần chạy trên JBoss 7.1.1 (được xây dựng trong JAX-RS 1.1).

  1. Tắt quét gói Restease trong web.xml của bạn:

    <context-param> 
        <param-name>resteasy.scan</param-name> 
        <param-value>false</param-value> 
    </context-param> 
    <context-param> 
        <param-name>resteasy.scan.providers</param-name> 
        <param-value>false</param-value> 
    </context-param> 
    <context-param> 
        <param-name>resteasy.scan.resources</param-name> 
        <param-value>false</param-value> 
    </context-param> 
    
  2. Hủy bỏ tất cả các thẻ với "jaxrs" từ standalone.xml. Nếu không, bạn sẽ vẫn phải đối mặt với LinkageError vì JBoss giữ 1.1 spec trên.!

  3. Tạo yourApp.war WEB-INF \ JBoss-triển khai-structure.xml chỉ thích được chỉ ra ở đây: https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7#ClassLoadinginAS7-JBossDeploymentStructureFile

Bằng cách này, không chỉ:

java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;

Disapears, nhưng cũng có, JAXB hoạt động tốt (No ClassNotFoundException for javax.xml.bind.JAXBException khi mô-đun javax.xml.bind.api cũng được kích hoạt).

Obs1: Câu hỏi ban đầu là trộn áo 1.x với áo 2.x. Không có PojoMappingFeature trong gói 2.x và cơ sở là org.glassfish.jersey. Hãy xem https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json

Obs2: Tôi cũng đã thử các cách tiếp cận khác như mở rộng gói ResourceConfig và quét từ đó hoặc đăng ký lớp học trực tiếp. Không có gì làm việc như tài liệu thích hợp trong mục 3. Vì vậy, giữ servlet của tôi bị ảnh hưởng:

<servlet> 
     <servlet-name>WebNize REST Service</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>br.com.webnize.rest.service</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>WebNize REST Service</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 

Tôi hy vọng nó sẽ giúp người khác!

Các vấn đề liên quan