簡體   English   中英

如何在使用Jersey時在界面上注釋JAX-RS

[英]How to annotate JAX-RS on an interface while using Jersey

這個問題已經被問了幾次 ,但答案似乎不工作,和/或澤西已經改變,有更多的變化。

我正在使用JAX-RS和Jersey(版本2.24)公開一些REST API。 我希望使用JAX-RS和一個具體實現(沒有任何注釋)來注釋接口。 但是,由於這個補丁澤西停止支持這種可能性。 據我了解規范 ,它並沒有嚴格禁止這樣做。

如果子類或實現方法具有任何JAX-RS注釋,則忽略超類或接口方法上的所有注釋。

意味着這樣做是完全可以的。 在許多情況下,使用接口是好的,並且服務器和客戶端各自具有它們各自的實現。

那里有很多解決方案,

  1. 使用ResourceConfig並執行registerClasses(MyImplementation.class) 但是,這不起作用。
  2. 禁用web.xml的包掃描配置,創建自定義javax.ws.rs.Application並從那里執行實現register 不行。
  3. 使用ResourceConfig並定義一個自定義的AbstractBinder並執行bind以便Jersey的依賴注入可以找到具體的實現。 不行。
  4. 使用RESTEasy。 RESTEasy似乎沒有像澤西島那樣強加接口限制。 從來沒有嘗試過。

如果有人可以分享他們的經驗,我將不勝感激。 任何有關如何讓澤西島工作的幫助也會很棒。 至於選項(4)是否真的有必要切換? 下面的示例代碼。

MyResource

 package com.foo;

import javax.ws.rs.GET;
import javax.ws.rs.Path;


@Path("/hello")
public interface MyResource {

  @GET
  public String sayHello();

}

MyResourceImpl

package com.bar;

public class MyResourceImpl implements MyResource {

  @Override
  public String sayHello() {
    return "Hello Jersey";
  }
}

還有一個web.xml ,它啟用了包掃描以掃描com.foo

在Jersey中,我們應該將類級別@Path放在實現而不是接口上。

包com.foo;

import javax.ws.rs.GET;
import javax.ws.rs.Path;


@Path("/hello")
public interface MyResource {

  @GET
  public String sayHello();

}


MyResourceImpl

package com.bar;
@Path("/hello")
public class MyResourceImpl implements MyResource {

  @Override
  public String sayHello() {
    return "Hello Jersey";
  }
}

如果要將Resource接口與實現分開(允許您使用某些REST客戶端(如resteasy客戶端)的接口),可以在實現上使用@RequestScoped。 因此,這個bean可以使用注入的資源,如EJB,EntityManager,......使用你的示例:

import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("/hello")
public interface MyResource {

   @GET
   public String sayHello();
}

MyResourceImpl

package com.bar;

@RequestScoped
public class MyResourceImpl implements MyResource {

  @Override
  public String sayHello() {
    return "Hello Jersey";
  }
}

然而,您必須考慮到,只要在實現代碼中使用特定的JAX-RS類(如UriInfo,Response對象,...),您就會在實現和JAX-RS API之間創建耦合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM