2015-06-23 47 views
1

我有一個非常簡單的EJB 3.0模塊與Maven,它只有兩個會話Bean一個無狀態的,另一種是單...當我試圖部署Glassfish的3.0服務器上的項目,我得到這個異常:在部署應用程序異常: 無效的EJB JAR:它包含零EJB部署期間發生Glassfish的3.0:異常,同時部署EJB模塊中.....無效的EJBĴAR:它包含零EJB

錯誤。注:1,一種有效的EJB JAR 需要至少一個會話,實體(的1.x/2.x樣式),或 消息驅動的Bean。 2. EJB3 +實體bean(@Entity)是POJO和 請將它們打包爲庫jar。 3.如果jar文件包含用EJB組件級別註釋 (@Stateless,@Stateful,@MessageDriven,@Singleton)註釋的有效的 EJB,請檢查 server.log以查看註釋是否已正確處理。 有關更多詳細信息,請參閱server.log。

我驗證與Glassfish的驗證工具的項目中,我得到這個例外,但我不知道我該怎麼辦?

Verifier output unparsable 
Verifier output (C:\Users\Mariam.Moustafa\Documents\NetBeansProjects\web\EmployeesTimer\target\EmployeesTimer-1.0-SNAPSHOT.jar.xml) not found. 

下面是pom.xml中:

<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> 

    <groupId>com.unilever</groupId> 
    <artifactId>EmployeesTimer</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>ejb</packaging> 

    <name>EmployeesTimer</name> 

    <properties> 
     <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>com.sun.jersey</groupId> 
      <artifactId>jersey-bundle</artifactId> 
      <version>1.8</version> 
     </dependency> 

     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-api</artifactId> 
      <version>6.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.9.2</version> 
     </dependency> 

     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId> 
      <version>1.9.2</version> 
     </dependency> 

     <!-- slf4j Logger --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.7</version> 
     </dependency>  

     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.17</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>1.7.7</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
        <compilerArguments> 
         <endorseddirs>${endorsed.dir}</endorseddirs> 
        </compilerArguments> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-ejb-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <ejbVersion>3.1</ejbVersion> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.1</version> 
       <executions> 
        <execution> 
         <phase>validate</phase> 
         <goals> 
          <goal>copy</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>${endorsed.dir}</outputDirectory> 
          <silent>true</silent> 
          <artifactItems> 
           <artifactItem> 
            <groupId>javax</groupId> 
            <artifactId>javaee-endorsed-api</artifactId> 
            <version>6.0</version> 
            <type>jar</type> 
           </artifactItem> 
          </artifactItems> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

    <repositories> 
     <repository> 
      <id>unknown-jars-temp-repo</id> 
      <name>A temporary repository created by NetBeans for libraries and jars it could not identify. Please replace the dependencies in this repository with correct ones and delete this repository.</name> 
      <url>file:${project.basedir}/lib</url> 
     </repository> 
     <repository> 
      <id>m2.dev.java.net</id> 
      <url>http://download.java.net/maven/2</url> 
      <layout>default</layout> 
     </repository> 
     <repository> 
      <id>prime-repo</id> 
      <name>PrimeFaces Maven Repository</name> 
      <url>http://repository.primefaces.org</url> 
      <layout>default</layout> 
     </repository> 
    </repositories> 
</project> 

我確認我有2個簡單的EJB

@Stateless public class EmployeesFacade {} 
@Singleton public class TimerService { 
@EJB EmployeesFacade emloyeesFacade; 
} 

下面是代碼:

首先@Singleton EJB豆

package com.employeestimer.services; 

import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.ClientResponse; 
import com.sun.jersey.api.client.WebResource; 
import com.unilever.employeestimer.enums.ConnectionEnum; 
import com.unilever.employeestimer.exceptions.BusinessException; 
import java.io.IOException; 
import javax.ejb.EJB; 
import javax.ejb.Schedule; 
import javax.ejb.Singleton; 
import javax.naming.NamingException; 
import javax.ws.rs.core.MediaType; 
import org.codehaus.jackson.JsonProcessingException; 
import org.slf4j.LoggerFactory; 


@Singleton 
public class TimerService { 
    static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(TimerService.class); 

    @EJB 
    EmployeesFacade emloyeesFacade; 

    private final static String U_ENGAGE_URL = "http://..../webresources/employees/update"; 

    @Schedule(second="*", minute="*/1",hour="*", persistent=false) 
    public void doWork() throws JsonProcessingException, IOException, NamingException{ 
     try{ 
      String input = emloyeesFacade.getUsersData(ConnectionEnum.USERNAME.getCode(), ConnectionEnum.PASSWORD.getCode()); 
      consumeRESTfulWebService(input);    
     }catch(BusinessException e){ 
      LOGGER.error("",e); 
     } 

    } 

    private void consumeRESTfulWebService(String input){    
     try { 
      LOGGER.debug("input = " + input); 
      Client client = Client.create(); 
      WebResource webResource = client.resource(U_ENGAGE_URL); 
      ClientResponse response = webResource.type(MediaType.TEXT_PLAIN).post(ClientResponse.class, input); 
      if (response.getStatus() != ClientResponse.Status.NO_CONTENT.getStatusCode()) { 
       throw new RuntimeException("Failed : HTTP error code : " 
        + response.getStatus()); 
      } 
      LOGGER.debug("Output from Server .... \n"); 
     } catch (Exception e) { 
      LOGGER.error("",e); 
    } 
    } 
} 

,這裏是外觀bean:

package com.employeestimer.services; 

import com.employeestimer.beans.EmployeeData; 
import com.employeestimer.enums.ConfigurationsEnum; 
import com.employeestimer.enums.ConnectionEnum; 
import com.employeestimer.exceptions.BusinessException; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Hashtable; 
import java.util.List; 
import javax.ejb.Stateless; 
import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
import javax.naming.directory.Attribute; 
import javax.naming.directory.SearchControls; 
import javax.naming.directory.SearchResult; 
import javax.naming.ldap.Control; 
import javax.naming.ldap.InitialLdapContext; 
import javax.naming.ldap.LdapContext; 
import javax.naming.ldap.PagedResultsControl; 
import javax.naming.ldap.PagedResultsResponseControl; 
import org.codehaus.jackson.JsonProcessingException; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.ObjectWriter; 
import org.slf4j.LoggerFactory; 


@Stateless 
public class EmployeesFacade { 

    static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(EmployeesFacade.class); 

    public String getLDAPConnectionType() { 
     return ConfigurationsEnum.LDAP_Connection_Type.getCode(); 
    } 

    public String getDomain() { 
     return ConfigurationsEnum.DOMAIN.getCode(); 
    } 

    public String getLDAPIP() { 
     return ConfigurationsEnum.LDAP_IP.getCode(); 
    } 

    public String getLDAPPort() { 
     return ConfigurationsEnum.LDAP_PORT.getCode(); 
    } 

    public String getLDAPBase() { 
     return ConfigurationsEnum.LDAP_BASE.getCode(); 
    } 

    private LdapContext getContext(String username, String password) throws BusinessException, NamingException { 
     Hashtable env = new Hashtable(); 
     if (getDomain() == null || getLDAPConnectionType() == null 
       || getLDAPIP() == null || getLDAPPort() == null) { 
      throw new BusinessException("error_general"); 
     } 
     String domain = getDomain(); 
     String url = getLDAPConnectionType() + "://" + getLDAPIP() + ":" + getLDAPPort(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, url); 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.REFERRAL, "follow"); 
     if (!username.contains("@")) { 
      username = username + "@" + domain; 
     } 
     env.put(Context.SECURITY_PRINCIPAL, username); 
     env.put(Context.SECURITY_CREDENTIALS, password); 
     return new InitialLdapContext(env, null); 
    } 

    public String getUsersData(String username, String password) throws BusinessException, JsonProcessingException, IOException, NamingException { 
     List<EmployeeData> employeelist = new ArrayList<EmployeeData>(); 
     EmployeeData employee; 
     String json = ""; 
     try { 
      LdapContext context = getContext(username, password); 
      SearchControls constraints = new SearchControls(); 
      constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); 
      String[] attrIDs = {"mail"}; //, "sn", "cn", "c", "l"}; 
      constraints.setReturningAttributes(attrIDs); 
      // Activate paged results 
      int pageSize = Integer.parseInt(ConnectionEnum.PAGESIZE.getCode()); 
      byte[] cookie = null; 
      context.setRequestControls(new Control[]{new PagedResultsControl(pageSize, 
       Control.NONCRITICAL)}); 
      int total; 
      NamingEnumeration<SearchResult> result = null; 
      do { 
       /* perform the search */ 
       result = context.search(getLDAPBase(), "(&(objectClass=User)(c=EG))", constraints); 
       /* for each entry print out name + all attrs and values */ 
       while (result != null && result.hasMore()) { 
        SearchResult entry = (SearchResult) result.next(); 
        employee = new EmployeeData(); 
        Attribute attribute; 

        if (entry.getAttributes() != null) { 
         if (entry.getAttributes().get("mail") != null) { 
          attribute = entry.getAttributes().get("mail"); 
          employee.setEmail(attribute != null ? attribute.toString().replace("mail: ", "") : ""); 
          employeelist.add(employee); 
         } 
        } 
      } 
       // Examine the paged results control response 
       Control[] controls = context.getResponseControls(); 
       if (controls != null) { 
        for (int i = 0; i < controls.length; i++) { 
         if (controls[i] instanceof PagedResultsResponseControl) { 
          PagedResultsResponseControl prrc = (PagedResultsResponseControl) controls[i]; 
          total = prrc.getResultSize(); 
          if (total != 0) { 
           LOGGER.debug("***************** END-OF-PAGE " + "(total : " + total + ") *****************\n"); 
          } else { 
           LOGGER.debug("***************** END-OF-PAGE " + "(Page no. " + i + ") ***************\n"); 
          } 
          cookie = prrc.getCookie(); 
         } 
        } 
       } else { 
        LOGGER.debug("No controls were sent from the server"); 
       } 
       // Re-activate paged results 
       context.setRequestControls(new Control[]{new PagedResultsControl(
        pageSize, cookie, Control.CRITICAL)}); 
      } while (cookie != null); 
      //result.close(); 
      context.close(); 
      ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); 
      json = ow.writeValueAsString(employeelist); 
      LOGGER.debug("\n \n \n ************* \n ************* \n ************* \n \n THE SIZE = " + employeelist.size() + "\n \n ************* \n ************* \n ************* \n \n \n"); 
     } catch (NamingException ex) { 
      String detailmessage = ex.getExplanation(); 
      if (detailmessage.contains(" 32 ")) { 
       // User not Found 
       throw new BusinessException("error_invalidUser"); 
      } else if (detailmessage.contains(" 49 ")) { 
       if (detailmessage.contains(" 775 ") || detailmessage.contains(" 701 ") || detailmessage.contains(" 533 ")) { 
        //Invalid Account 
        throw new BusinessException("error_invalidAccount"); 
       } else { 
        //Invalid Username or password 
        throw new BusinessException("error_invalidUsernamePassword"); 
       } 
      } else { 
       LOGGER.error("error_general", ex); 
       throw new BusinessException("error_general"); 
      } 
     } 
     return json; 
    } 
} 
+1

請你'pom.xml'添加到問題... – unwichtich

+0

@unwichtich的pom.xml被添加 –

回答

2

我沒有看到你的設置有問題。如果您在本項目中確實有一些課程使用@Singleton@Stateless進行註釋,則應該可以使用。

但很重要的一點是,如果你有沒有GlassFish中的庫提供的任何相關性,你必須與你的應用程序,它是不可能的EJB/JAR包裝它們打包。您必須將其打包爲WAR或EAR文件。

對於一個快速啓動,請嘗試以下操作:

變化

<packaging>ejb</packaging> 

<packaging>war</packaging> 

,改變

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-ejb-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <ejbVersion>3.1</ejbVersion> 
      </configuration> 
     </plugin> 

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.1.1</version> 
      <configuration> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 

如果要將其打包爲EAR,則可以使用maven-ear-plugin

參見:

+0

親愛的unwichtich,當我嘗試你的建議,它工作正常,Glassfish成功部署戰爭文件!但是EJB模塊呢?我如何在GlassFish中部署?這個問題的原因是什麼? 我確認我有2個簡單的EJB @無國籍 公共類EmployeesFacade {} @辛格爾頓 公共類TimerService { @ EJB EmployeesFacade emloyeesFacade; } –

+1

查看錯誤消息中的第三個點,在'server.log'中可能會有另一個錯誤消息。 – unwichtich

+0

server.log沒有例外!驗證器輸出不可解析 驗證器輸出(C:\ Users \ Mariam.Moustafa \ Documents \ NetBeansProjects \ web \ EmployeesTimer \ target \ EmployeesTimer-1.0-SNAPSHOT .war.xml)找不到。 –