Glassfish 3.0:部署ejb模块时出现异常......无效的ejb j ar:它包含零ejb

时间:2015-06-23 13:02:52

标签: java ejb-3.0 glassfish-3

我有一个非常简单的带有maven的ejb 3.0模块,它只有两个会话bean,一个是无状态的,另一个是单例...当我尝试在Glassfish 3.0服务器上部署项目时,我遇到了这个例外:

  

部署期间出错:部署应用时出现异常:   无效的ejb jar:它包含零ejb。注意:1。有效的ejb jar   需要至少一个会话,实体(1.x / 2.x样式)或   消息驱动的bean。 2. EJB3 +实体bean(@Entity)是POJO和   请将它们打包为库jar。 3.如果jar文件包含有效   使用EJB组件级别注释注释的EJB   (@Stateless,@ Stateful,@ MessageDriven,@ Singleton),请检查   server.log查看是否正确处理了注释。   有关更多详细信息,请参阅server.log。

我使用Glassfish Verifier工具验证项目,我得到了这个例外,但我不知道该怎么办?

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 bean

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);
    }
    }
}

这是Facade 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 个答案:

答案 0 :(得分: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

另见: