【问题标题】:Why we should add @Stateless to an Entity in a Maven Project?为什么我们应该将@Stateless 添加到 Maven 项目中的实体?
【发布时间】:2017-07-18 09:34:04
【问题描述】:

当我用Maven 创建我的第一个空Entreprise Application 时,我遇到了这个错误,即使我创建了Entity

    Invalid ejb jar it contains zero ejb
Note: 
1. A valid ejb jar requires at least one session, entity (1.x/2.x style), or message-driven bean. 
2. EJB3+ entity beans (@Entity) are POJOs and please package them as library jar. 
3. If the jar file contains valid EJBs which are annotated with EJB component level annotations (@Stateless, @Stateful, @MessageDriven, @Singleton), please check server.log to see whether the annotations were processed properly.

Entity.java:

package test;

import java.io.Serializable;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;


@javax.persistence.Entity
public class Entity implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}

然后我发现解决这个问题的方法是在`Entity Class中添加@Stateless: 封装测试;

import java.io.Serializable;
import javax.ejb.Stateless;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Stateless
@javax.persistence.Entity
public class Entity implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}

它工作正常,但现在我想知道为什么我必须将此注释添加到Entity 才能正常工作?

配置细节是:

  • Netbeans 8.1
  • Glassfish 4.1.1
  • pgAdmin III
  • Maven 3.5

EAR 模块的 maven-ear-plugin 配置如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ear-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <version>6</version>
        <defaultLibBundleDir>lib</defaultLibBundleDir>
    </configuration>
</plugin>

【问题讨论】:

  • 您的“企业应用程序”是否只包含一个 WAR 文件?
  • @SteveC 是的

标签: maven jakarta-ee java-ee-6 netbeans-8 glassfish-4


【解决方案1】:

@Stateless 注释的存在可能会导致运行时发生奇怪的事情,所以你应该删除它。

由于生成的 jar 包含零个 EJB,因此应将其打包类型从 ejb 更改为 jar

确保您的 maven-ear-plugin 看起来像:

        <plugin>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.10.1</version>
            <configuration>
                <version>7</version>
                <defaultLibBundleDir>lib</defaultLibBundleDir>
                <modules>
                    <!-- no ejb module -->
                    <webModule>
                       ...
                    </webModule>
                </modules>
            </configuration>
        </plugin>

并且您的应用程序应该正确部署。

此外,当您使用 GlassFish 4.x 时,您可以完全放弃“企业应用程序”,只需将所有内容放在您的 WAR 文件中,然后可以自行部署。

如果需要,您甚至可以稍后将 EJB 添加到 WAR。

如今,您只会在处理古老的单体应用时才使用 EAR。使您的构建仅根据需要变得复杂。

【讨论】:

  • 这是我的“ear pom 文件”:&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupId&gt;BookTest&lt;/groupId&gt; &lt;artifactId&gt;BookTest&lt;/artifactId&gt; &lt;version&gt;1.0&lt;/version&gt; &lt;packaging&gt;pom&lt;/packaging&gt; &lt;name&gt;BookTest&lt;/name&gt; &lt;modules&gt; &lt;module&gt;BookTest-ear&lt;/module&gt; &lt;module&gt;BookTest-web&lt;/module&gt; &lt;module&gt;BookTest-ejb&lt;/module&gt; &lt;/modules&gt; 我应该删除什么?
  • 那是你的父 pom,而不是你的 BookTest-ear pom。
  • 对不起,这是:&lt;plugin&gt; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt; &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt; &lt;version&gt;2.3.2&lt;/version&gt; &lt;/plugin&gt; &lt;plugin&gt; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt; &lt;artifactId&gt;maven-ear-plugin&lt;/artifactId&gt; &lt;version&gt;2.6&lt;/version&gt; &lt;configuration&gt; &lt;version&gt;6&lt;/version&gt; &lt;defaultLibBundleDir&gt;lib&lt;/defaultLibBundleDir&gt; &lt;/configuration&gt; &lt;/plugin&gt;
  • 这可能会正常工作。您根本不需要编译器插件,因为该模块不应包含任何 Java 源文件。如果需要,您可以安全地将版本升级到 7 以及插件版本。
  • 是的,这应该可以,但不幸的是它不起作用
猜你喜欢
  • 2016-05-17
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 2011-05-02
  • 2022-01-21
  • 1970-01-01
  • 2021-05-18
相关资源
最近更新 更多