{"id":2021,"date":"2017-05-14T12:02:20","date_gmt":"2017-05-14T10:02:20","guid":{"rendered":"http:\/\/blog.rabahi.net\/?page_id=2021"},"modified":"2017-05-14T12:32:12","modified_gmt":"2017-05-14T10:32:12","slug":"java-spring-cxf","status":"publish","type":"page","link":"https:\/\/blog.rabahi.net\/?page_id=2021","title":{"rendered":"Java Spring &#8211; CXF"},"content":{"rendered":"<div id=\"toc_container\" class=\"no_bullets\"><p class=\"toc_title\">Contents<\/p><ul class=\"toc_list\"><li><a href=\"#Prerequistes\"><span class=\"toc_number toc_depth_1\">1<\/span> Prerequistes<\/a><\/li><li><a href=\"#Dependencies\"><span class=\"toc_number toc_depth_1\">2<\/span> Dependencies<\/a><\/li><li><a href=\"#Server_Part\"><span class=\"toc_number toc_depth_1\">3<\/span> Server Part<\/a><ul><li><a href=\"#Model\"><span class=\"toc_number toc_depth_2\">3.1<\/span> Model<\/a><\/li><li><a href=\"#WebServices\"><span class=\"toc_number toc_depth_2\">3.2<\/span> WebServices<\/a><\/li><li><a href=\"#Configuration\"><span class=\"toc_number toc_depth_2\">3.3<\/span> Configuration<\/a><\/li><\/ul><\/li><li><a href=\"#Client_Part\"><span class=\"toc_number toc_depth_1\">4<\/span> Client Part<\/a><ul><li><a href=\"#Configuration-2\"><span class=\"toc_number toc_depth_2\">4.1<\/span> Configuration<\/a><\/li><li><a href=\"#Use_SOAP_Client\"><span class=\"toc_number toc_depth_2\">4.2<\/span> Use SOAP Client<\/a><\/li><li><a href=\"#Use_REST_Client\"><span class=\"toc_number toc_depth_2\">4.3<\/span> Use REST Client<\/a><\/li><\/ul><\/li><\/ul><\/div>\n<h1><span id=\"Prerequistes\">Prerequistes<\/span><\/h1>\n<p>Please read : <a href=\"?page_id=1549\">Java spring &#8211; quickstart<\/a><\/p>\n<h1><span id=\"Dependencies\">Dependencies<\/span><\/h1>\n<p>If you use maven, please add this to your pom.xml:<\/p>\n<pre lang=\"xml\">\r\n<dependencies>\r\n(...)\r\n\r\n\t<!-- apache cxf -->\r\n\t<dependency>\r\n\t\t<groupId>org.apache.cxf<\/groupId>\r\n\t\t<artifactId>cxf-spring-boot-starter-jaxws<\/artifactId>\r\n\t\t<version>${cxf-spring-boot.version}<\/version>\r\n\t<\/dependency>\r\n\r\n\t<dependency>\r\n\t\t<groupId>org.apache.cxf<\/groupId>\r\n\t\t<artifactId>cxf-spring-boot-starter-jaxrs<\/artifactId>\r\n\t\t<version>${cxf-spring-boot.version}<\/version>\r\n\t<\/dependency>\r\n\r\n\t<dependency>\r\n\t\t<groupId>org.apache.cxf<\/groupId>\r\n\t\t<artifactId>cxf-rt-rs-service-description-swagger<\/artifactId>\r\n\t\t<version>${cxf-spring-boot.version}<\/version>\r\n\t<\/dependency>\r\n\r\n\t<!-- jackson rest providers -->\r\n\t<dependency>\r\n\t\t<groupId>com.fasterxml.jackson.jaxrs<\/groupId>\r\n\t\t<artifactId>jackson-jaxrs-json-provider<\/artifactId>\r\n\t\t<version>${jackson-jaxrs.version}<\/version>\r\n\t<\/dependency>\r\n\r\n\t<dependency>\r\n\t\t<groupId>com.fasterxml.jackson.jaxrs<\/groupId>\r\n\t\t<artifactId>jackson-jaxrs-xml-provider<\/artifactId>\r\n\t\t<version>${jackson-jaxrs.version}<\/version>\r\n\t<\/dependency>\r\n\r\n\t<dependency>\r\n\t\t<groupId>com.fasterxml.jackson.jaxrs<\/groupId>\r\n\t\t<artifactId>jackson-jaxrs-yaml-provider<\/artifactId>\r\n\t\t<version>${jackson-jaxrs.version}<\/version>\r\n\t<\/dependency>\r\n\r\n(...)\r\n<\/dependencies>\r\n<\/pre>\n<h1><span id=\"Server_Part\">Server Part<\/span><\/h1>\n<h2><span id=\"Model\">Model<\/span><\/h2>\n<p>Let&#8217;s deal with the following model:<\/p>\n<pre lang=\"java\">\r\npublic class User {\r\n\t\r\n\tprivate String firstName;\r\n\tprivate String lastName;\r\n\r\n\t\/**\r\n\t * Default constructor.\r\n\t *\/\r\n\tpublic User(){}\r\n\t\r\n\t\/**\r\n\t * @param firstName\r\n\t * @param lastName\r\n\t *\/\r\n\tpublic User(String firstName, String lastName) {\r\n\t\tsuper();\r\n\t\tthis.firstName = firstName;\r\n\t\tthis.lastName = lastName;\r\n\t}\r\n\r\n\/\/ getters and setters.\r\n}\r\n<\/pre>\n<h2><span id=\"WebServices\">WebServices<\/span><\/h2>\n<p>Let&#8217;s create two web services:<\/p>\n<ul>\n<li> One with no parameters called &#8220;getDefaultUser&#8221;.<\/li>\n<li> One with a string parameter called &#8220;sayHelloByString&#8221;<\/h1>\n<\/ul>\n<p>The interface :<\/p>\n<pre lang=\"java\">\r\nimport javax.jws.WebService;\r\nimport javax.ws.rs.Consumes;\r\nimport javax.ws.rs.GET;\r\nimport javax.ws.rs.Path;\r\nimport javax.ws.rs.PathParam;\r\nimport javax.ws.rs.Produces;\r\n\r\n@WebService\r\npublic interface MyPrettyWebService {\r\n\t@GET\r\n\t@Path(\"\/sayHelloByString\/{message}\") \r\n\t@Consumes({\"application\/json\", \"application\/xml\", \"application\/yaml\"}) \r\n\t@Produces({\"application\/json\", \"application\/xml\", \"application\/yaml\"})\r\n        String sayHelloByString(@PathParam(\"message\") String message);\r\n\t\r\n\t@GET\r\n\t@Path(\"\/getDefaultUser\")\r\n\t@Produces({\"application\/json\", \"application\/xml\", \"application\/yaml\"})\r\n\tUser getDefaultUser();\t\r\n}\r\n<\/pre>\n<p>The implementation :<\/p>\n<pre lang=\"java\">\r\n@WebService(endpointInterface = \"net.rabahi.java.jee.spring.service.HelloWorld\")\r\n@Service\r\npublic class MyPrettyWebServiceImpl implements MyPrettyWebService {\r\n\t\r\n\tpublic String sayHelloByString(String message) {\r\n\t\treturn \"Hello \" + message;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic User getDefaultUser() {\r\n\t\tUser user = new User();\r\n\t\tuser.setFirstName(\"John\");\r\n\t\tuser.setLastName(\"Doe\");\r\n\t\treturn user;\r\n\t}\r\n}\r\n<\/pre>\n<h2><span id=\"Configuration\">Configuration<\/span><\/h2>\n<p>In WebConfig, add servlet CXFServlet and map it to &#8220;\/services\/*&#8221;:<\/p>\n<pre lang=\"java\">\r\npublic class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {\r\n(..)\r\n\r\n    \/* (non-Javadoc)\r\n     * @see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer#onStartup(javax.servlet.ServletContext)\r\n     *\/\r\n    @Override\r\n    public void onStartup(ServletContext container) {\r\n        \/\/ Method implementation\r\n\tAnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();\r\n        context.register(MainConfig.class);\r\n        container.addListener(new ContextLoaderListener(context));\r\n\r\n        ServletRegistration.Dynamic dispatcher = container.addServlet(\"dispatcher\", new CXFServlet());\r\n        dispatcher.addMapping(\"\/services\/*\");\r\n    }\r\n}\r\n<\/pre>\n<p>And declare your rest and soap endpoints :<\/p>\n<pre lang=\"java\">\r\n@Configuration\r\n@ImportResource({ \"classpath:META-INF\/cxf\/cxf.xml\", \"classpath:META-INF\/cxf\/cxf-servlet.xml\" })\r\n\r\npublic class WebServerConfig {\r\n    @Autowired\r\n    private Bus bus;\r\n\r\n    @Bean\r\n    public Endpoint soapEndPoint() {\r\n\tEndpointImpl endpoint = new EndpointImpl(bus, new HelloWorldImpl());\r\n\tendpoint.publish(\"\/soap\");\r\n\treturn endpoint;\r\n    }\r\n\t\r\n    @Bean\r\n    public Server restEndPoint() {\r\n        JAXRSServerFactoryBean endpoint = new JAXRSServerFactoryBean();\r\n        endpoint.setBus(bus);\r\n        endpoint.setAddress(\"\/rest\");\r\n        endpoint.setServiceBeans(Arrays.<Object>asList(new MyPrettyWebServiceImpl()));\r\n        endpoint.setFeatures(Arrays.asList(new Swagger2Feature()));\r\n        \r\n        List<Object> providers = new ArrayList<>();\r\n        providers.add(new JacksonJaxbJsonProvider());\r\n        providers.add(new JacksonJaxbXMLProvider());\r\n        providers.add(new JacksonJaxbYAMLProvider());\r\n        endpoint.setProviders(providers);\r\n        \r\n        return endpoint.create();\r\n    }\r\n}\r\n<\/pre>\n<h1><span id=\"Client_Part\">Client Part<\/span><\/h1>\n<h2><span id=\"Configuration-2\">Configuration<\/span><\/h2>\n<p>Create the restClient and soapClient beans:<\/p>\n<pre lang=\"java\">\r\n@Configuration\r\npublic class ClientConfiguration {\r\n\r\n        @Bean(name = \"soapClient\")\r\n\tpublic MyPrettyWebService proxyFactoryBean() {\r\n\t\tJaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();\r\n\t\tproxyFactory.setServiceClass(HelloWorld.class);\r\n\t\tproxyFactory.setAddress(\"http:\/\/localhost:8080\/services\/soap\");\r\n\t\treturn proxyFactory.create();\r\n\t}\r\n\r\n        @Bean(name = \"restClient\")\r\n\tpublic WebClient restClient() {\r\n\t\treturn WebClient.create(\"http:\/\/localhost:8080\/services\/rest\",\r\n\t\t\t\tArrays.asList(\r\n\t\t\t\t\tjacksonJsonProvider(),\r\n\t\t\t\t\tjacksonXMLProvider(),\r\n\t\t\t\t\tjacksonYAMLProvider()\r\n\t\t\t\t));\r\n\t}\r\n}\r\n\r\n<\/pre>\n<h2><span id=\"Use_SOAP_Client\">Use SOAP Client<\/span><\/h2>\n<pre lang=\"java\">\r\npublic class MyImplentation {\r\n\r\n  private ApplicationContext context = new AnnotationConfigApplicationContext(ClientConfiguration.class);\r\n  private MyPrettyWebService myPrettyWebService = (MyPrettyWebService) context.getBean(\"soapClient\");\r\n\r\n  public void method(){\r\n     String response = myPrettyWebService.sayHelloByString(\"john\");\r\n     User user = myPrettyWebService.getDefaultUser();\r\n  }\r\n}\r\n<\/pre>\n<h2><span id=\"Use_REST_Client\">Use REST Client<\/span><\/h2>\n<pre lang=\"java\">\r\npublic class MyImplentation {\r\n\r\n  private ApplicationContext context = new AnnotationConfigApplicationContext(ClientConfiguration.class);\r\n  private WebClient webclient = (WebClient ) context.getBean(\"restClient\");\r\n\r\n  public void method(){\r\n     \/\/ sayHelloByString\r\n     String message=\"john\";\r\n     webclient.path(\"\/sayHelloByString\/\"+message).accept(MediaType.APPLICATION_JSON_TYPE);\r\n     String response = webclient.get(String.class);\r\n\r\n     \/\/ getDefaultUser\r\n     webclient.path(\"\/getDefaultUser\").accept(MediaType.APPLICATION_JSON_TYPE);\r\n     User user= webclient.get(User.class);\r\n  }\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Contents1 Prerequistes2 Dependencies3 Server Part3.1 Model3.2 WebServices3.3 Configuration4 Client Part4.1 Configuration4.2 Use SOAP Client4.3 Use REST Client Prerequistes Please read : Java spring &#8211; quickstart Dependencies If you use maven, please add this to your pom.xml: (&#8230;) org.apache.cxf cxf-spring-boot-starter-jaxws ${cxf-spring-boot.version} org.apache.cxf cxf-spring-boot-starter-jaxrs ${cxf-spring-boot.version} org.apache.cxf cxf-rt-rs-service-description-swagger ${cxf-spring-boot.version} com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider ${jackson-jaxrs.version} com.fasterxml.jackson.jaxrs jackson-jaxrs-xml-provider ${jackson-jaxrs.version} com.fasterxml.jackson.jaxrs jackson-jaxrs-yaml-provider ${jackson-jaxrs.version} [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1547,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2021","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/blog.rabahi.net\/index.php?rest_route=\/wp\/v2\/pages\/2021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rabahi.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/blog.rabahi.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rabahi.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rabahi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2021"}],"version-history":[{"count":8,"href":"https:\/\/blog.rabahi.net\/index.php?rest_route=\/wp\/v2\/pages\/2021\/revisions"}],"predecessor-version":[{"id":2029,"href":"https:\/\/blog.rabahi.net\/index.php?rest_route=\/wp\/v2\/pages\/2021\/revisions\/2029"}],"up":[{"embeddable":true,"href":"https:\/\/blog.rabahi.net\/index.php?rest_route=\/wp\/v2\/pages\/1547"}],"wp:attachment":[{"href":"https:\/\/blog.rabahi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}