2017-10-11 117 views
0

我試圖做一些REST服務與JBOSS AS7,但是當我嘗試訪問他們的日誌說404。
我一直在尋找解決方案,但沒有找到解決方案。
這些服務位於WAR項目中,該項目位於EAR文件中,用於在JBOSS中進行部署。REST服務does'n加載jboss AS 7

我使用CXF和CDI來提供服務。
JBOSS有EasyRest 3.0.5版本。

這是WAR項目的pom.xml:

<?xml version="1.0"?> 
<project 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 


<modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>projectParent</groupId> 
     <artifactId>projectParent</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
    </parent> 
    <groupId>projectParent</groupId> 
    <artifactId>projectWARModule</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <name>projectWARModule Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <org.apache.cxf.version>3.0.0</org.apache.cxf.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.enterprise</groupId> 
      <artifactId>cdi-api</artifactId> 
      <version>1.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-integration-cdi</artifactId> 
      <version>${org.apache.cxf.version}</version> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api --> 
     <dependency> 
      <groupId>javax.annotation</groupId> 
      <artifactId>javax.annotation-api</artifactId> 
      <version>1.2</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-rt-transports-http</artifactId> 
      <version>${org.apache.cxf.version}</version> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-wsdl --> 
     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-rt-wsdl</artifactId> 
      <version>3.0.0</version> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-ws-policy --> 
     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-rt-ws-policy</artifactId> 
      <version>3.0.0</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.jaxrs</groupId> 
      <artifactId>jackson-jaxrs-json-provider</artifactId> 
      <version>2.2.3</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.2.3</version> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.weld.servlet</groupId> 
      <artifactId>weld-servlet</artifactId> 
      <version>2.1.2.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.weld</groupId> 
      <artifactId>weld-core</artifactId> 
      <version>2.1.2.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 
    </dependencies> 

    <repositories> 
     <repository> 
      <id>maven2-repository.dev.java.net</id> 
      <url>http://download.java.net/maven/2/</url> 
     </repository> 
     <repository> 
      <id>jboss-public</id> 
      <url>http://repository.jboss.org/nexus/content/groups/public/</url> 
     </repository> 
    </repositories> 
    <build> 
     <finalName>projectWAR</finalName> 
    </build> 
</project> 

這是EAR包的pom.xml的,它有一個JAR的引用,因爲在教程中,我發現了有關使耳朵Maven的它說,使用它,但沒有任何東西:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>projectParent</groupId> 
    <artifactId>projectParent</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    </parent> 
    <artifactId>projectEARModule</artifactId> 
    <packaging>ear</packaging> 
    <dependencies> 
    <dependency> 
     <groupId>projectParent</groupId> 
     <artifactId>projectJARModule</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
    </dependency> 
    <dependency> 
     <groupId>projectParent</groupId> 
     <artifactId>projectWARModule</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>war</type> 
    </dependency> 
    </dependencies> 
    <build> 
    <finalName>projectEar</finalName> 
    </build> 
</project> 

這個類被命名爲PeopleRestService和服務過的:

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 }) 
    @GET 
    public Collection<Person> getPeople(@QueryParam("page") @DefaultValue("1") final int page) { 
     return peopleService.getPeople(page, 5); 
    } 

    @Produces({ MediaType.APPLICATION_JSON }) 
    @Path("/{email}") 
    @GET 
    public Person getPerson(@PathParam("email") final String email) { 
     return peopleService.getByEmail(email); 
    } 

    @Produces({ MediaType.APPLICATION_JSON }) 
    @POST 
    public Response addPerson(@Context final UriInfo uriInfo, 
      @FormParam("email") final String email, 
      @FormParam("firstName") final String firstName, 
      @FormParam("lastName") final String lastName) { 

     final Person person = peopleService.addPerson(email, firstName, lastName); 
     return Response.created(uriInfo.getRequestUriBuilder().path(email).build()).entity(person).build(); 
    } 

    @Produces({ MediaType.APPLICATION_JSON }) 
    @Path("/{email}") 
    @PUT 
    public Person updatePerson(   
      @PathParam("email") final String email, 
      @FormParam("firstName") final String firstName, 
      @FormParam("lastName") final String lastName) { 

     final Person person = peopleService.getByEmail(email); 

     if(firstName != null) { 
      person.setFirstName(firstName); 
     } 

     if(lastName != null) { 
      person.setLastName(lastName); 
     } 

     return person;    
    } 

    @Path("/{email}") 
    @DELETE 
    public Response deletePerson(@PathParam("email") final String email) { 
     peopleService.removePerson(email); 
     return Response.ok().build(); 
    } 
} 

而這個名爲JaxRsApiApplication:

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 { 

} 

這是beans.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
     http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     bean-discovery-mode="all"> 
</beans> 

這是在web.xml:

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>Archetype Created Web Application</display-name> 

    <context-param> 
     <param-name>resteasy.scan</param-name> 
     <param-value>false</param-value> 
    </context-param> 
    <context-param> 
     <param-name>resteasy.scan.providers</param-name> 
     <param-value>false</param-value> 
    </context-param> 
    <context-param> 
     <param-name>resteasy.scan.resources</param-name> 
     <param-value>false</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>PeopleRestService</servlet-name> 
     <servlet-class>org.apache.cxf.cdi.CXFCdiServlet</servlet-class> 
     <init-param> 
      <param-name>org.apache.cxf.cdi</param-name> 
      <param-value>com.example.rs</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>PeopleRestService</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

當我嘗試運行此一個tomcat完美的工作,但在JBOSS中只能得到一個404.
我認爲可能是庫的問題,但不知道什麼問題especificaly。

如果有人知道會發生什麼,這將是一個很大的幫助。 非常感謝,如果我的英語不好,我很抱歉。

祝您有愉快的一天。

UPDATE
作爲@JanezKuhar說我reemplace在POM進口。現在的依賴關係是這樣的:

<dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-api</artifactId> 
      <version>7.0</version> 
      <scope>provided</scope> 
     </dependency> 

<!--  <dependency> --> 
<!--   <groupId>javax.enterprise</groupId> --> 
<!--   <artifactId>cdi-api</artifactId> --> 
<!--   <version>1.1</version> --> 
<!--  </dependency> --> 
<!--  <dependency> --> 
<!--   <groupId>org.apache.cxf</groupId> --> 
<!--   <artifactId>cxf-integration-cdi</artifactId> --> 
<!--   <version>${org.apache.cxf.version}</version> --> 
<!--  </dependency> --> 
<!--  <dependency> --> 
<!--   <groupId>org.apache.cxf</groupId> --> 
<!--   <artifactId>cxf-rt-frontend-jaxrs</artifactId> --> 
<!--   <version>${org.apache.cxf.version}</version> --> 
<!--  </dependency> --> 
<!--  <dependency> --> 
<!--   <groupId>javax.annotation</groupId> --> 
<!--   <artifactId>javax.annotation-api</artifactId> --> 
<!--   <version>1.2</version> --> 
<!--  </dependency> --> 
<!--  <dependency> --> 
<!--   <groupId>org.apache.cxf</groupId> --> 
<!--   <artifactId>cxf-rt-transports-http</artifactId> --> 
<!--   <version>${org.apache.cxf.version}</version> --> 
<!--  </dependency> --> 
<!--  <dependency> --> 
<!--   <groupId>org.apache.cxf</groupId> --> 
<!--   <artifactId>cxf-rt-wsdl</artifactId> --> 
<!--   <version>3.0.0</version> --> 
<!--  </dependency> --> 
<!--  <dependency> --> 
<!--   <groupId>org.apache.cxf</groupId> --> 
<!--   <artifactId>cxf-rt-ws-policy</artifactId> --> 
<!--   <version>3.0.0</version> --> 
<!--  </dependency> --> 

     <dependency> 
      <groupId>com.fasterxml.jackson.jaxrs</groupId> 
      <artifactId>jackson-jaxrs-json-provider</artifactId> 
      <version>2.2.3</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.2.3</version> 
     </dependency> 

<!--  <dependency> --> 
<!--   <groupId>org.jboss.weld.servlet</groupId> --> 
<!--   <artifactId>weld-servlet</artifactId> --> 
<!--   <version>2.1.2.Final</version> --> 
<!--  </dependency> --> 
<!--  <dependency> --> 
<!--   <groupId>org.jboss.weld</groupId> --> 
<!--   <artifactId>weld-core</artifactId> --> 
<!--   <version>2.1.2.Final</version> --> 
<!--  </dependency> --> 
<!--  <dependency> --> 
<!--   <groupId>javax.inject</groupId> --> 
<!--   <artifactId>javax.inject</artifactId> --> 
<!--   <version>1</version> --> 
<!--  </dependency> --> 
    </dependencies> 

但現在給了我以下錯誤:

產生的原因:拋出java.lang.ClassNotFoundException:org.apache.cxf.cdi.CXFCdiServlet從[模塊「的部署。 projectEar.ear.projectWARModule-0.0.1-SNAPSHOT.war:main「from Service Module Loader]

+0

相同的耳朵在tomcat中工作,但不在jboss的權利? –

+0

爲什麼要導入JavaEE API部件(焊接,CXF)的所有實現。讓App服務器決定使用哪一個,並且只需將[javaee-api](https://mvnrepository.com/artifact/javax/javaee-api)工件(其中包含所有接口定義)添加到您的根項目與'提供'範圍。 –

+0

@yılmaz.war在tomat中工作,但不在jboss中的.ear中工作。 –

回答

0

Finaly make this works。

由於@JanezKuhar說我評論的POM所有額外的庫和增加了兩個,現在看起來是這樣的:

<?xml version="1.0"?> 
<project 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>projectParent</groupId> 
     <artifactId>projectParent</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
    </parent> 
    <groupId>projectParent</groupId> 
    <artifactId>projectWARModule</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <name>projectWARModule Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <org.apache.cxf.version>3.0.0</org.apache.cxf.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-api</artifactId> 
      <version>7.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf</artifactId> 
      <version>3.0.0</version> 
      <type>pom</type> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.jboss.weld.servlet</groupId> 
      <artifactId>weld-servlet</artifactId> 
      <version>2.1.2.Final</version> 
     </dependency> 
    </dependencies> 

    <repositories> 
     <repository> 
      <id>maven2-repository.dev.java.net</id> 
      <url>http://download.java.net/maven/2/</url> 
     </repository> 
     <repository> 
      <id>jboss-public</id> 
      <url>http://repository.jboss.org/nexus/content/groups/public/</url> 
     </repository> 
    </repositories> 

    <build> 
     <finalName>projectWAR</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-ejb-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <ejbVersion>3.1</ejbVersion> 
        <archive> 
         <manifestEntries> 
          <Dependencies>org.apache.cxf.impl</Dependencies> 
         </manifestEntries> 
        </archive> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

評論servlet的一部分,並設置RestEasy的掃描真實,在網上。xml:

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>Archetype Created Web Application</display-name> 

    <context-param> 
     <param-name>resteasy.scan</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <context-param> 
     <param-name>resteasy.scan.providers</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <context-param> 
     <param-name>resteasy.scan.resources</param-name> 
     <param-value>true</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
    </listener> 

</web-app> 

現在,它可以工作,我可以訪問部署在jboss中的REST服務。

感謝您提供的幫助。

0

jboss-app.xml在哪裏? Maven是否創建它? 在jboss-app.xml中,你(或者maven)應該創建應用程序的上下文根。

jboss-app.xml: Every EAR application should specify a unique string name for the class loader. It's from JBoss doc. link