javascript
Apache CXF 3.0:CDI 1.1支持可替代Spring
在幾周前剛剛發布Apache CXF 3.0時 ,該項目又邁出了滿足JAX-RS 2.0規范要求的又一個重要步驟:與CDI 1.1集成。 在此博客文章中,我們將看幾個有關Apache CXF 3.0和Apache CXF 3.0如何協同工作的示例。
從3.0版開始, Apache CXF包含一個名為cxf-integration-cdi的新模塊,可以輕松將其添加到您的Apache Maven POM文件中:
這個新模塊僅包含兩個組件(實際上,其中包含一些組件,但它們是關鍵組件):
- CXFCdiServlet :用于引導Apache CXF應用程序的servlet,其作用與CXFServlet和CXFNonSpringJaxrsServlet相同,…
- JAXRSCdiResourceExtension :可移植的CDI 1.1擴展,其中發生了所有魔術
在啟用CDI 1.1的環境中運行時,便攜式擴展由CDI 1.1容器發現,并使用生命周期事件進行初始化。 這實際上就是您所需要的! 讓我們看一下實際的應用程序。
我們將構建一個非常簡單的JAX-RS 2.0應用程序,以使用Apache CXF 3.0和CDI 1.1參考實現JBoss Weld 2.1來管理人員。 我們將用于人物表示的Person類只是一個簡單的Java bean:
package com.example.model;public class Person {private String email;private String firstName;private String lastName;public Person() {}public Person( final String email, final String firstName, final String lastName ) {this.email = email;this.firstName = firstName;this.lastName = lastName;}// Getters and setters are ommited// ... }現在非常普遍,我們將在嵌入式Jetty 9.1容器中運行應用程序,而Starter類正是這樣做的:
package com.example;import org.apache.cxf.cdi.CXFCdiServlet; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.jboss.weld.environment.servlet.BeanManagerResourceBindingListener; import org.jboss.weld.environment.servlet.Listener;public class Starter { public static void main( final String[] args ) throws Exception {final Server server = new Server( 8080 );// Register and map the dispatcher servletfinal ServletHolder servletHolder = new ServletHolder( new CXFCdiServlet() );final ServletContextHandler context = new ServletContextHandler(); context.setContextPath( "/" ); context.addEventListener( new Listener() ); context.addEventListener( new BeanManagerResourceBindingListener() );context.addServlet( servletHolder, "/rest/*" );server.setHandler( context );server.start(); server.join(); } }請注意, CXFCdiServlet和兩個強制偵聽器已添加到上下文中:
- org.jboss.weld.environment.servlet.Listener負責CDI注入
- org.jboss.weld.environment.servlet.BeanManagerResourceBindingListener將對BeanManager的引用綁定到JNDI位置java:comp / env / BeanManager ,以使其可以從應用程序的任何位置訪問
這樣,您就可以使用CDI 1.1的全部功能。 讓我們介紹使用@Named注釋注釋的PeopleService類,以及使用@PostConstruct聲明和注釋的初始化方法來創建一個人。
@Named public class PeopleService {private final ConcurrentMap< String, Person > persons = new ConcurrentHashMap< String, Person >(); @PostConstructpublic void init() { persons.put( "a@b.com", new Person( "a@b.com", "Tom", "Bombadilt" ) );}// Additional methods // ... }到目前為止,我們還沒有談到在CDI 1.1環境中配置JAX-RS 2.0應用程序和資源。 原因很簡單:根據應用程序的不同,您可以采用零努力配置或完全可定制的配置。 讓我們經歷兩種方法。
使用零努力配置,您可以定義一個空的JAX-RS 2.0應用程序和任意數量的JAX-RS 2.0資源: Apache CXF 3.0隱式地通過將每個資源類與該應用程序相關聯來將它們連接在一起。 這是JAX-RS 2.0應用程序的示例:
package com.example.rs;import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application;@ApplicationPath( "api" ) public class JaxRsApiApplication extends Application { }這里是一個JAX-RS 2.0資源PeopleRestService中注入了PeopleService托管bean:
package com.example.rs;import java.util.Collection;import javax.inject.Inject; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo;import com.example.model.Person; import com.example.services.PeopleService;@Path( "/people" ) public class PeopleRestService {@Inject private PeopleService peopleService;@Produces( { MediaType.APPLICATION_JSON } )@GETpublic Collection< Person > getPeople( @QueryParam( "page") @DefaultValue( "1" ) final int page ) {// ...}@Produces( { MediaType.APPLICATION_JSON } )@Path( "/{email}" )@GETpublic Person getPerson( @PathParam( "email" ) final String email ) {// ...}@Produces( { MediaType.APPLICATION_JSON } )@POSTpublic Response addPerson( @Context final UriInfo uriInfo,@FormParam( "email" ) final String email, @FormParam( "firstName" ) final String firstName, @FormParam( "lastName" ) final String lastName ) {// ...}// More HTTP methods here // ... }不需要任何其他操作: Apache CXF 3.0應用程序可以像這樣運行并具有完整的功能。 GitHub上提供了示例項目的完整源代碼。 請記住,如果遵循此樣式,則僅應聲明一個空的JAX-RS 2.0應用程序。
通過可定制的方法,可以使用更多選項,但是還需要做更多的工作。 每個JAX-RS 2.0應用程序都應提供非空的getClasses()或/和getSingletons()集合實現。 但是,JAX-RS 2.0資源類保持不變。 這是一個示例(基本上導致了我們之前所見的相同應用程序配置):
package com.example.rs;import java.util.Arrays; import java.util.HashSet; import java.util.Set;import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application;import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;@ApplicationPath( "api" ) public class JaxRsApiApplication extends Application {@Inject private PeopleRestService peopleRestService;@Produces private JacksonJsonProvider jacksonJsonProvider = new JacksonJsonProvider(); @Overridepublic Set< Object > getSingletons() {return new HashSet<>(Arrays.asList( peopleRestService, jacksonJsonProvider ));} }請注意, JAXRSCdiResourceExtension便攜式CDI 1.1擴展會自動為每個JAX-RS 2.0應用程序(擴展Application的應用程序 )和資源(以@Path注釋)創建托管bean。 這樣,它們立即可用于注入(例如,上面的代碼段中的PeopleRestService )。 類JacksonJsonProvider用@Provider注釋進行注釋,因此將被視為JAX-RS 2.0提供程序。 以這種方式定義的JAX-RS 2.0應用程序沒有限制。 使用此應用程序的示例項目的完整源代碼可在GitHub上獲得 。
無論您選擇哪種方法,我們的示例應用程序都可以正常工作。 讓我們構建它并運行:
> mvn clean package > java -jar target/jax-rs-2.0-cdi-0.0.1-SNAPSHOT.jar調用已實現的REST API對可確認應用程序正常運行和配置。 讓我們發出GET命令,以確保在創建托管bean時調用了以@PostConstruct注釋的PeopleService方法。
> curl http://localhost:8080/rest/api/peopleHTTP/1.1 200 OK Content-Type: application/json Date: Thu, 29 May 2014 22:39:35 GMT Transfer-Encoding: chunked Server: Jetty(9.1.z-SNAPSHOT)[{"email":"a@b.com","firstName":"Tom","lastName":"Bombadilt"}]這是POST命令的示例:
> curl -i http://localhost:8080/rest/api/people -X POST -d "email=a@c.com&firstName=Tom&lastName=Knocker"HTTP/1.1 201 Created Content-Type: application/json Date: Thu, 29 May 2014 22:40:08 GMT Location: http://localhost:8080/rest/api/people/a@c.com Transfer-Encoding: chunked Server: Jetty(9.1.z-SNAPSHOT){"email":"a@c.com","firstName":"Tom","lastName":"Knocker"}在此博客文章中,我們僅介紹了Apache CXF和CDI 1.1集成現在可以實現的功能。 只需提及,在大多數JEE應用程序服務器和Servlet容器上都可以進行嵌入式Apache Tomcat 7.x / 8.x以及基于WAR的帶有CDI 1.1的Apache CXF部署。
請查看官方文檔并嘗試一下!
- 完整的源代碼可在GitHub上獲得 。
翻譯自: https://www.javacodegeeks.com/2014/06/apache-cxf-3-0-cdi-1-1-support-as-alternative-to-spring.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Apache CXF 3.0:CDI 1.1支持可替代Spring的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 群聊撤回1小时以上微信妙招
- 下一篇: Spring / Hibernate使用