RESTful 서비스를위한 Jersey 및 Guice 사용에 대한 실용적인 조언
온라인에서 볼 수 있듯이 Guice + Jersey 통합의 최첨단은 두 팀이 곤경에 처한 것으로 보이는 2008 년 이후 정체되었습니다. 문제의 핵심은 JAX-RS 어노테이션이 필드 및 메소드 주입을 수행하고 이것은 Guice의 자체 종속성 주입과 잘 작동하지 않는다는 것입니다.
내가 찾은 몇 가지 예는 설명하기에 충분하지 않습니다.
Google App Engine Java의 Jersey + Guice에 대한 Iqbalyusuf의 게시물 은 많은 상용구 (수동으로 인젝터를 가져오고 호출)로 어려움을 겪습니다. 바인딩 및 주입이 Guice 주석을 통해 장면 뒤에서 발생해야합니다.
Jonathan Curran의 ' Creating a RESTful service with Jersey, Guice, and JSR-250 '기사 는 훨씬 더 최신 (2010)이기 때문에 희망을 주었지만 Guice ServletModule 내에서 Jersey 서비스를 시작하는 방법을 보여주는 것 이상으로 나아갔습니다. 그러나 실제 종속성 주입을 수행하는 예는 없습니다. 독자를위한 연습 문제로 남겨진 것 같습니다. Curran의 포스트는 실제로 Guice와 Jersey를 연결하는 올바른 첫 번째 단계 일 수 있으므로 그부터 시작할 계획입니다.
감질 나게 James Strachan은 다음과 같이 씁니다 .
JAX-RS는 Spring, Guice, GuiceyFruit 또는 JBossMC와 같은 의존성 주입 프레임 워크와 잘 작동합니다. 기본적으로 원하는 것을 선택할 수 있습니다.
그러나 나는 실무자의 관점에서 진실 인 증거를 보지 못합니다.
내가 부족한 것은 JAX-RS와 Guice 주석을 결합하는 방법에 대한 실용적인 예제와 설명입니다. 예를 들면 :
- Jersey가 이것을 제어하기를 원하기 때문에 어떤 리소스에도 생성자 주입을 사용할 수 없다고 생각합니다.
- @Inject를 @PathParam, @QueryParam 등과 결합 할 수 있는지 확실하지 않습니다.
- MessageBodyWriter 구현에서 주입을 사용하는 방법
누구든지 그 과정에서 하나 또는 다른 것을 희생하지 않고 Jersey와 Guice를 결합하는 사소하지 않은 응용 프로그램의 예를 가급적이면 소스와 함께 가지고 있습니까? 나는 상관없이이 길을 계속 가고 있지만, Jersey와 Guice 목록에있는 작은 조각들은 내가 나보다 앞서 온 다른 사람들의 일을 반복하고 있다고 생각하게 만든다.
Jersey와 Guice의 통합은 정체되지 않았습니다. 그 반대입니다. Paul과 Jersey 뒤의 그의 동료 덕분에 최신 1.7 릴리스에는 Guice 기반 서블릿과 함께 작동하는 특수 JerseyServletModule 클래스가 포함되어 있습니다. JAX-RS 리소스에 Guice 기반 생성자 주입이 작동합니다!문제는 JAX-RS 리소스의 생성자에서 @QueryParam과 같은 JAX-RS 주석을 사용하는 것입니다. 당신은 그것을 필요로하지 않습니다! 싱글 톤을 포함하여 POJO 주입에 Guice를 사용합니다. 그런 다음 JAX-RS는 URL 경로, 쿼리 매개 변수, 콘텐츠 유형 등과 같은 HTTP 기반 RESTful API를 구문 분석하는 데 가장 적합합니다. "산업적 강점"의 예도 필요하지 않습니다. Guice와 Jersey는 이미 전투 테스트를 거쳤습니다. 작동 방식을 보려면 완전한 작업 예제가 필요합니다. 그런 다음 고급 기능을 직접 실험 할 수 있습니다. 모두 최신 릴리스 인 Guice 3.0 및 Jersey 1.7을 사용하는 전체 예제는 다음 링크를 확인하십시오.
http://randomizedsort.blogspot.com/2011/05/using-guice-ified-jersey-in-embedded.html
여기에 Guice / Jersey / Jetty / Jackson 샘플 애플리케이션을 만들었습니다.
http://github.com/sunnygleason/j4-minimal
예를 개선하는 방법에 대한 질문이나 제안이 있으면 github를 통해 저에게 메시지를 보내주세요. 목표는 이것을 Java 스택에서 REST에 대한 매우 접근하기 쉬운 소개로 만드는 것입니다.
도움이 되었기를 바랍니다. 즐거운 하루 되세요!
-햇볕이 잘 드는
Sunnys 샘플 응용 프로그램에서 영감을 받아 Apache Tomcat과 같은 배포를 위해 표준 WAR 파일을 사용하는 유사한 샘플 프로젝트를 만들었습니다. 여기에서 프로젝트를 찾을 수 있습니다.
https://github.com/danbim/template-guice-jersey-tomcat
즐기세요! 다니엘
Jersey가 이것을 제어하기를 원하기 때문에 어떤 리소스에도 생성자 주입을 사용할 수 없다고 생각합니다.
리소스 생성은 저지에 의해 관리되기 때문에 guice의 생성자 주입을 사용할 수 없습니다. 이 경우 @Inject
삽입하려는 생성자 매개 변수 앞에 jersey의 주석을 사용할 수 있습니다 .
public NewsResource(@Inject NewsService service)
처음에는 Guice를 사용하여 Jersey 주석이 달린 클래스에서 생성자 주입을 수행하려고 시도했지만 상당히 사소한 응용 프로그램으로도 결국 작동하게되었습니다.
나는 여기 지침을 따랐다 : jersey-guice javadoc
필자의 경우 속임수는 web.xml (예 : Jersey ServletContainer)에서 표준 Jersey 구성을 제거하고 Guice 리스너와 Guice 필터 만 유지해야한다는 것입니다. 일단 Guice가 호출되어 JAX-RS 주석이 달린 객체를 만들고 Jersey는 예상대로 JAX-RS 주석이 달린 메서드 (예 : @GET 등)를 삽입했습니다.
Sunny Gleason의 예는 훌륭하지만 지금은 조금 구식입니다.
그래서 오늘 Guice와 Jersey가 서로 잘 어울리도록하기 위해 많은 노력을 기울인 끝에 다음 샘플 프로젝트를 만들었습니다.
https://github.com/MaliciousMustard/gradle-guice-jersey-jetty
이 프로젝트는 다음 기술을 사용합니다.
- DI 용 Guice
- RESTful API 용 Jersey
- POJO를 JSON으로 매핑하는 Jackson
- 웹 서버용 부두
- Gradle
가장 중요한 것은 추가하는 모든 새 리소스 클래스를 명시 적으로 지정할 필요가 없다는 것입니다. 스캔중인 패키지에 추가하는 한 (참조 malicious.mustard.modules.JerseyModule
) 자동으로 검색됩니다!
GWizard 에는 Jersey2와 Guice 간의 즉각적인 통합을 제공하는 모듈이 포함되어 있습니다. 다음은 완전한 JAX-RS 서비스의 예입니다.
public class Main {
@Path("/hello")
public static class HelloResource {
@GET
public String hello() {
return "hello, world";
}
}
public static class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(HelloResource.class);
}
}
public static void main(String[] args) throws Exception {
Guice.createInjector(new MyModule(), new JerseyModule()).getInstance(Run.class).start();
}
}
Note that this is based on the Squarespace jersey2-guice adapter, which may not function properly with future point releases of Jersey. GWizard also offers a RESTEasy JAX-RS module, which is preferred.
Here is a blog entry about this that might help: http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way
The Jersey-Guice plugin Javadoc provides a pretty good description:
These examples were all great starts for me, but I wanted a full MVC stack using Jersey-Guice at it's core. I've been working on refining that for sometime. As of this week this MVC stack is fully deployed to Maven Central repository as an archetype. This means you can now create a new Jersey-Guice stack with one Maven command:
mvn archetype:generate \
-DarchetypeGroupId=org.duelengine \
-DarchetypeArtifactId=duel-mvc-archetype \
-DarchetypeVersion=0.2.1
This automatically generates your own project with you specified package naming so you don't have to manually edit a template project.
See the project Readme.md for more details: https://bitbucket.org/mckamey/duel-mvc
Details on the dual-side views (client-side template & server-side views) I use are here: https://bitbucket.org/mckamey/duel but you could replace with whatever you use.
I found an interesting project for lightweight Jetty+Guice+Jackson web services: https://github.com/talis/jersey-common/
I created a Guice 4.2, Jetty 9.4 and Jersey 2.7 sample application:
https://github.com/bnsd55/jetty-jersey-guice-starter-kit
As Sunny said:
If you have any questions or suggestions for how to improve the example, feel free to message me via github. The goal is to make this a very accessible introduction to REST on the Java stack.
'developer tip' 카테고리의 다른 글
Windows는 자동 구성을 사용할 때 실제로 LAN (프록시) 설정을 어떻게 감지합니까? (0) | 2020.11.18 |
---|---|
jQuery.toggle (boolean)과 같은 것이 존재합니까? (0) | 2020.11.18 |
Haskell Weird Kinds : Kind of (->)는 ?? (0) | 2020.11.18 |
matplotlib / Python에서 백엔드를 전환하는 방법 (0) | 2020.11.18 |
JAX-RS 서비스에 JSON 오브젝트를 POST하는 방법 (0) | 2020.11.18 |