Jersey đã ngừng hoạt động với không tìm thấy


161

Tôi nhận được lỗi bên dưới trong khi chạy API Jersey trong Tomcat 8.5.11, điều này khiến API của tôi dừng:

Trạng thái HTTP 500 - Servlet.init () cho dịch vụ RESTlet Jersey đã ném ngoại lệ

Loại Báo cáo ngoại lệ

thông báo Servlet.init () cho servlet Jersey REST Service đã ném ngoại lệ

Mô tả Máy chủ gặp lỗi nội bộ khiến nó không thể đáp ứng yêu cầu này.

ngoại lệ

javax.servlet.ServletException: Servlet.init () cho servlet Jersey REST Service đã ném ngoại lệ org.apache.cirthina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.citalina.valves java: 79) org.apache.cirthina.valves.Ab tríchAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.citalina.connector.CoyoteAd Module.service (CoyoteAd Module.java:349) org.ap. dịch vụ (http11Processor.java:783) org.apache.coyote.Ab tríchProcessorLight. Process (AbstractProcessorLight.java:66) org.apache.coyote.AbaugeProtatio $ ConnectionHandler. Process (AbstractProtatio.java:798). net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1434) org.apache.tomcat.util.net.SocketProcessorBase.chạy (SocketProcessorBase.java:49) java.util.concản.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) java.util.concản.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:6). chủ đề.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)

nguyên nhân gốc rễ

java.lang.IllegalStateException: Không tìm thấy tiêm chích. org.glassfish.jersey.iternal.inject.Injections.lookupInjectionManagerFactory (Injections.java:97) org.glassfish.jersey.i INTERNal.inject.Injections.createInjectionManager (Injections.java:89) org.glass. (ApplicationHandler.java:282) org.glassfish.jersey.servlet.WebComponent. (WebComponent.java:335) org.glassfish.jersey.servlet.ServletContainer.init (ServletContainer.java:178) org.glass.j ServletContainer.init (ServletContainer.java:370) javax.servlet.GenericServlet.init (GenericServlet.java:158) org.apache.citalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.cirthina.valves.

Ứng dụng này được xây dựng với các phụ thuộc sau với gradle:

dependencies {
    compile (
        // REST
        "org.glassfish.jersey.containers:jersey-container-servlet:2.+",
        "javax.servlet:javax.servlet-api:4.+",
        // REST Token
        "org.bitbucket.b_c:jose4j:0.+",
        // MongoDB
        "org.hibernate.ogm:hibernate-ogm-bom:5.+",
        "org.hibernate.ogm:hibernate-ogm-infinispan:5.+",
        "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.+",
        "org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.+",
        "org.jboss.narayana.jta:narayana-jta:5.+",
        "org.jboss:jboss-transaction-spi:7.+",
        "log4j:log4j:1.+",
        "org.hibernate.ogm:hibernate-ogm-mongodb:5.+",
        "org.bouncycastle:bcprov-jdk15on:1.+"
    ) }

Tải về jersey-common-2.26-b04.jarnày có chứa các lớp còn thiếu dưới /org/glassfish/jersey/internal/inject/InjectionManagerFactory. Tệp jar được triển khai vào thư mục Tomcat bên dướiWEB-INF/lib

Điều gì có thể sai ở đây? Kịch bản gradle đã hoạt động trong vài tháng qua với cùng một phiên bản Tomcat.


1
Tôi thấy có một phiên bản mới của áo vào ngày 19/05 - kiểm tra xem đây có phải là vấn đề không, hiện tại tôi có vấn đề tương tự
Roman Kesler


Hướng dẫn này đã giúp tôi khắc phục sự cố này crunchify.com/ từ
JesseBoyd

Câu trả lời:


316

Thêm phụ thuộc này:

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.28</version>
</dependency>

xem https://stackoverflow.com/a/44536542/1070215

Đảm bảo không trộn các phiên bản phụ thuộc Jersey của bạn. Câu trả lời này cho biết phiên bản "2.28", nhưng sử dụng bất kỳ phiên bản nào mà các phiên bản phụ thuộc Jersey khác của bạn là.


2
Làm việc cho tôi với phiên bản phát hành 2.26. Không muốn sử dụng phiên bản beta trong mã sản xuất.
sagana

2
Cảm ơn bạn, đây là câu trả lời chính xác. Hoạt động với 2,26
mario

1
Xem thêm để được giải thích.
Paul Samsotha

2
Đây là nó cho tôi - phiên bản 2.28.
thợ rèn

Điều thú vị đối với tôi là nó đã hoạt động, và sau đó nó ngừng hoạt động UNTIL Tôi đã thực hiện việc đưa vào ở trên theo bài đăng này. Nhưng dù sao, cảm ơn bạn. Phiên bản cốt lõi của tôi là 2.30 và phiên bản tiêm của tôi như trên tức là 2.28.
Beezer

127

Jersey 2.26 và mới hơn không tương thích ngược với các phiên bản cũ hơn. Lý do đằng sau đó đã được nêu trong ghi chú phát hành :

Thật không may, cần phải thực hiện các thay đổi không tương thích ngược trong 2.26. API khách hàng phản ứng độc quyền của jersey đã hoàn toàn biến mất và không thể được hỗ trợ nữa - nó mâu thuẫn với những gì được giới thiệu trong JAX-RS 2.1 (đó là giá cho Jersey là "sân chơi đặc biệt ..").

Một thay đổi lớn hơn trong mã Jersey là cố gắng làm cho lõi Jersey độc lập với bất kỳ khung tiêm cụ thể nào. Như bạn có thể thấy, Jersey 2.x phụ thuộc khá nhiều vào HK2, điều này đôi khi gây ra sự cố (đặc biệt là khi chạy trên các thùng chứa tiêm khác. Jersey bây giờ xác định mặt tiền tiêm của chính nó, khi được triển khai đúng cách, sẽ thay thế tất cả tiêm nội Jersey.


Hiện tại, người ta nên sử dụng các phụ thuộc sau:

Maven

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.26</version>
</dependency>

Học sinh lớp

compile 'org.glassfish.jersey.core:jersey-common:2.26'
compile 'org.glassfish.jersey.inject:jersey-hk2:2.26'


11
Thở dài ... tại sao Jersey sẽ nâng phiên bản lên 3.0 nếu họ đang thực hiện một thay đổi đột phá ..
trevorism

1
@trevorism Tôi có cảm giác họ muốn giữ phiên bản chính đồng bộ với phiên bản chính của JAX-RS. Đó là điều duy nhất có ý nghĩa với tôi.
Paul Samsotha

Ngoài ra áo chung không phải là một yêu cầu (để thêm thủ công ). Điều này đã được kéo vào bởi jersey-server, cần được kéo bởi jersey-container-servlet-core hoặc bất kỳ sự phụ thuộc áo "chính" nào khác mà bạn sử dụng. Sự phụ thuộc duy nhất cần thiết để thoát khỏi lỗi trong câu hỏi là jersey-hk2 (hoặc jersey-cdi2-se, như được đề cập ở đây ).
Paul Samsotha

@LuisF, Sẽ là chính xác nếu nó không bao gồm sự phụ thuộc chung không cần thiết. Đây đã là một phụ thuộc bắc cầu.
Paul Samsotha

47

Đây là lý do. Bắt đầu từ Jersey 2.26, Jersey đã loại bỏ HK2 như một sự phụ thuộc cứng rắn . Nó tạo ra một SPI như một mặt tiền cho nhà cung cấp tiêm phụ thuộc, dưới dạng InjectionManagerInjectionManagerFactory. Vì vậy, để Jersey chạy, chúng ta cần phải có một triển khai InjectionManagerFactory. Có hai triển khai này, dành cho HK2 và CDI . Sự phụ thuộc HK2 là những jersey-hk2người khác đang nói về.

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.26</version>
</dependency>

Sự phụ thuộc CDI là

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-cdi2-se</artifactId>
    <version>2.26</version>
</dependency>

Điều này (jersey-cdi2-se) chỉ nên được sử dụng cho môi trường SE và không phải môi trường EE.

Jersey đã thực hiện thay đổi này để cho phép những người khác cung cấp khuôn khổ tiêm phụ thuộc của riêng họ. Họ không có bất kỳ kế hoạch nào để thực hiện bất kỳ điều gì khác InjectionManager, mặc dù những người khác đã cố gắng thực hiện một kế hoạch cho Guice .


1
Lưu ý rằng việc sử dụng CDI (jersey-cdi2-se) yêu cầu cấu hình bean.xml trong META-INF. Nếu không, ngoại lệ sau sẽ bị ném: java.lang.IllegalStateException: WELD-ENV-000016: Thiếu tệp bean.xml trong META-INF
Marco Montel

Câu trả lời này đã giúp tôi có rất nhiều mâu thuẫn, +1 để làm rõ jersey-cdi2-se chỉ nên được sử dụng cho SE
Daniel Arechiga

11

Chọn DI để tiêm thứ vào Jersey:

Mùa xuân 4:

<dependency>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-spring4</artifactId>
</dependency>

Mùa xuân 3:

<dependency>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-spring3</artifactId>
</dependency>

HK2:

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
</dependency>

2
Nó không dễ như thế đâu. Bạn không thể chuyển đổi HK2 cho mùa xuân. Việc jersey-springtích hợp vẫn sử dụng cầu HK2 dưới mui xe để làm cho nó hoạt động.
Paul Samsotha

2

Cách duy nhất tôi có thể giải quyết là thông qua:

org.glassfish.jersey.core jersey-server $ {jersey-2-version}

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>${jersey-2-version}</version>
</dependency>

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>${jersey-2-version}</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-common -->
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-common</artifactId>
    <version>${jersey-2-version}</version>
</dependency>

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>${jersey-2-version}</version>
</dependency>

Vì vậy, chỉ khi tôi thêm jersey-container-servletjersey-hk2nó sẽ chạy mà không có lỗi


0

Theo như tôi có thể thấy các phụ thuộc đã thay đổi giữa 2,26-b03 và 2,26-b04 (HK2 đã được chuyển từ biên dịch sang testCompile) ... có thể có một số thay đổi trong các phụ thuộc áo chưa được hoàn thành (hoặc dẫn đến một lỗi).

Tuy nhiên, ngay bây giờ giải pháp đơn giản là bám sát phiên bản cũ hơn :-)


-2

Đây là sự phụ thuộc mới (tháng 8 năm 2017)

    <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-common -->
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-common</artifactId>
    <version>2.0-m03</version>
</dependency>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.