[英]How to annotate JAX-RS on an interface while using Jersey
這個問題已經被問了幾次前 ,但答案似乎不工作,和/或澤西已經改變,有更多的變化。
我正在使用JAX-RS和Jersey(版本2.24)公開一些REST API。 我希望使用JAX-RS和一個具體實現(沒有任何注釋)來注釋接口。 但是,由於這個補丁澤西停止支持這種可能性。 據我了解規范 ,它並沒有嚴格禁止這樣做。
如果子類或實現方法具有任何JAX-RS注釋,則忽略超類或接口方法上的所有注釋。
意味着這樣做是完全可以的。 在許多情況下,使用接口是好的,並且服務器和客戶端各自具有它們各自的實現。
那里有很多解決方案,
ResourceConfig
並執行registerClasses(MyImplementation.class)
。 但是,這不起作用。 web.xml
的包掃描配置,創建自定義javax.ws.rs.Application
並從那里執行實現register
。 不行。 ResourceConfig
並定義一個自定義的AbstractBinder
並執行bind
以便Jersey的依賴注入可以找到具體的實現。 不行。 如果有人可以分享他們的經驗,我將不勝感激。 任何有關如何讓澤西島工作的幫助也會很棒。 至於選項(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.