标签: java-ee-6

部署为仅限WAR的EJB 3.1应用程序:ejb-jar.xml怎么样?

我有一个JavaEE6应用程序,由Web东西和EJB组成,并且部署为仅使用WAR(使用EJB3.1).构建基于Maven.我刚刚看了一下新的可能命令在Java EE 6的初始化模块在这里,我还需要我的应用程序.此外,我想有一个选项来定义XML中的一些EJB属性.

由于该示例是作为EAR项目部署的,因此订单在application.xml中定义.但是在WAR部署的项目中,没有application.xml.现在我想知道我可以在哪里定义这样的信息?或者是否可以在WAR-deployed-app中以某种方式使用application.xml?

编辑:

哎呀我没有正确读取模块顺序示例,在第一时间我认为它是关于我的应用程序中的EJB加载的顺序.当然我的WAR-app中只有一个模块,所以排序没有意义.

好吧,但就我而言,一个大问题仍然存在(也改变了问题标题以反映变化):ejb-jar.xml怎么样?我可以用XML以某种方式定义关于我的EJB的东西(因为它对某些设置有用,以避免重新编译)?

java java-ee java-ee-6 ejb-3.1

8
推荐指数
2
解决办法
1万
查看次数

CDI事件观察器方法是否与EJB兼容?

我有一个Singleton EJB(javax.ejb.Singleton版本.叹气.),它有一个CDI观察者方法.当我尝试将此部署到glassfish 3.1时,服务器无法在没有任何实际解释的情况下部署EAR文件 - 只是说在部署期间没有任何更多细节存在异常.

SEVERE: Exception while loading the app
SEVERE: Exception while shutting down application container
....
SEVERE: Exception while shutting down application container : java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)

这是CDI事件监听器:

public void updateFromGranule(@Observes @CloudMask GranuleAvailableEvent granuleEvent) {
    LOG.info("updating cloud map");
    update(granuleEvent.getGranule(), CloudMask.class);
    fireUpdate();
}
Run Code Online (Sandbox Code Playgroud)

如果我将Singleton bean更改为只是一个@ApplicationScoped bean,那么app就可以正常部署.同样,如果我删除CDI事件观察器方法,应用程序部署正常.我实际上需要将该类作为EJB单例,因为我想要EJB的事务,线程安全等,所以将它作为@ApplicationScoped POJO留下来对我来说并没有多大用处.这个问题似乎并不局限于Singleton bean - 我已经通过将注释更改为@Stateless和@Stateful进行了实验,我得到了相同的问题.

在我看来,这可能是Weld中的一个错误,也许Weld和EJB正在争论他们如何代理该方法 - 可能是EJB需要添加一个拦截器类并包装该方法以确保线程安全,而Weld正在尝试做某事否则使事件监听器工作?

我在这里误解了什么,CDI事件处理程序是否应该在EJB上使用(在这种情况下应该有来自glassfish的更好的错误消息) - 或者这实际上只是CDI或EJB实现中的错误?

glassfish cdi java-ee-6 ejb-3.1 jboss-weld

8
推荐指数
2
解决办法
4439
查看次数

当事务属性为"必需"时,为什么CMT会在退出EJB方法时提交?

我一直发现我已经存在的事务是在标记的EJB的任何方法中提交的@ejb.transaction type="Required".这可能是正确的吗?

我的期望是,一个EJB"要求"交易是指:如果有一个已经存在,它会礼貌地离开它时未提交这样做,不管是谁调用开始()可以继续调用之前将它用于进一步的操作commit()rollback().[当然,如果首先没有事务,那么EJB方法将同时调用begin()commit()/ rollback().]

我的期望是错误的,还是我应该寻找配置错误?

可能有必要补充说我在EJB中使用了Hibernate 3.我在调用EJB方法之前获取了UserTransaction.EJB生成的包装器ServerTransaction.commit()在退出时调用,Hibernate将其挂钩并利用该机会关闭其Session.我得到的错误是一个Hibernate延迟加载异常,因为当我尝试访问Hibernate持久化对象上的getter时会话被关闭.所以从技术上来说,我不是百分之百确定ServerTransaction.commit()我是否观察到我必须承诺UserTransaction我开始(可能ServerTransaction.commit()并不总是真正遵循"真正的"提交?),但如果它没有 - 那么基于什么基础是Hibernate关闭会议?

更新: 我相信我的上述假设是正确的,但我的观察有点偏.请参阅下面的我自己提供的答案.

ejb transactions java-ee java-ee-6 ejb-3.1

8
推荐指数
2
解决办法
1万
查看次数

Java EE 6中的EJB模块是什么?

当我在eclipse中创建一个新的Java EE 6项目时,我看到了许多类型的项目....

  • 企业应用
  • EJB模块
  • 企业应用客户端
  • 打包存档

这些不同的类型是什么?它们是什么意思?

netbeans java-ee java-ee-6

8
推荐指数
2
解决办法
1万
查看次数

了解cdi Instance <>和.get()vs @Inject

我对以下情况中使用哪个有点困惑:

假设servlet创建一个处理用户http会话的Application,应用程序是这样的:

public class Application extends AbstractHTTPApplication {

@Inject
private Instance<MainView> mainView;

public void setupApplication() {
   this.setView( mainView.get() );
}
Run Code Online (Sandbox Code Playgroud)

后来我有一个@SessionScopedbean SSB,我想注入每个用户的bean:

@SessionScoped
public class SSB {}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用常规@Inject SSB ssb;字段时MainView,我没有SSB为每个用户获取新内容:

public class MainView {

@Inject
private SSB usersSSB;

   public someMethod() {
       usersSSB.doSomething();
       System.identityHashCode( usersSSB );
   }
}
Run Code Online (Sandbox Code Playgroud)

在两个用户的测试中,我在两个用户的会话中得到了相同的实例usersSSB.我认为这不可能......我想,既然SSB是SessionScoped,每个用户会话都会有一个新的,无论它在哪里@Inject编辑,它都会引用用户的SSB.

相反,我试过:

public class MainView {

@Inject
private Instance<SSB> usersSSB;

   public someMethod() {
       usersSSB.get().doSomething(); …
Run Code Online (Sandbox Code Playgroud)

java-ee cdi java-ee-6 jboss-weld

8
推荐指数
1
解决办法
1万
查看次数

显式本地EJB未使用Arquillian注入

我使用Arquillian来测试具有显式本地和远程接口的无状态会话bean.但是在测试中,Arquillian不会在具有本地接口类型的字段中"注入"任何内容,但它适用于远程接口.

@Stateless
public class TestServiceImpl implements TestServiceLocal, TestServiceRemote {
    public String greet() {
        return "hallo";
    }
}
Run Code Online (Sandbox Code Playgroud)

远程接口:

@Remote
public interface TestServiceRemote {
    public String greet();
}
Run Code Online (Sandbox Code Playgroud)

语言环境界面:

@Local
public interface TestServiceLocal {
    public String greet();
}
Run Code Online (Sandbox Code Playgroud)

这是测试:

@RunWith(Arquillian.class)
public class GenericEntityDaoEjbIntegrationTest {

    @Deployment
    public static JavaArchive createTestArchive()
                  throws UnsupportedEncodingException {
        return ShrinkWrap.create(JavaArchive.class, "test.jar")
                .addClasses(
                        TestServiceLocal.class,
                        TestServiceRemote.class,
                        TestServiceImpl.class);
    }

    @EJB
    private TestServiceLocal testServiceLocal;

    @EJB
    private TestServiceRemote testServiceRemote;

    //Will Fail
    @Test
    public void testTestServiceLocal() {
        assertNotNull(this.testServiceLocal);
    }

    //Success    
    @Test
    public void …
Run Code Online (Sandbox Code Playgroud)

java testing java-ee java-ee-6 jboss-arquillian

8
推荐指数
2
解决办法
9416
查看次数

使用JBoss AS7中的@DataSourceDefinition配置MySQL DataSource

我能够在standalone.xml中配置MySQL DataSource并且工作正常.但我想使用@DataSourceDefinition注释配置DataSource .

如何在JBoss AS7中使用@DataSourceDefinition配置MySQL数据源?

我已经尝试过的是:

@DataSourceDefinition(
        className = "com.mysql.jdbc.Driver",
        name = "java:global/jdbc/MyDS",
        serverName="localhost",
        portNumber=3306,
        user = "root",
        password = "admin",
        databaseName = "test"
)
@Startup
public class DBConfig {
}
Run Code Online (Sandbox Code Playgroud)

与此persistence.xml一起:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="javaee6-app" transaction-type="JTA">
        <jta-data-source>java:global/jdbc/MyDS</jta-data-source>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

我有mysql连接器jar文件WEB-INF/lib.

但是当我部署应用程序时,我收到此错误:

(DeploymentScanner-threads - 2){"JBAS014653:复合操作失败并被回滚.失败的步骤:"=> {"操作步骤-2"=> {"JBAS014771:缺少/不可用依赖的服务"=> [" jboss.persistenceunit.\ "javaee6-app.war#javaee6-应用程序\" jboss.naming.context.java.global.jdbc.MyDSMissing [jboss.persistenceunit.\ "javaee6-app.war#javaee6-应用程序\" 的JBoss. naming.context.java.global.jdbc.MyDS]"]}}}

java mysql java-ee-6 jboss7.x

8
推荐指数
1
解决办法
3235
查看次数

Maven ojdbc jar依赖性错误

标题

我试图在我的Java EE6应用程序(类名VisualizerRepository.java)中使用jdbc连接,我在nexus存储库中有jdbc驱动程序

该类必须执行存储过程并打印过程的结果.由于JPA 2.0不支持使用jdbc调用过程.

package com.nfsmith.crm.data.repository;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import oracle.jdbc.OracleTypes;
import org.jboss.logging.Logger;

@Named
@ApplicationScoped
public class VisualizerRepository 
{
    DataSource datasource;
    Connection connection;
    CallableStatement statement;
    @PostConstruct
    public void initDBConnection()
    {
        InitialContext context;
        try 
        {
        context = new InitialContext();

        datasource = (DataSource) context.lookup("java:jboss/datasources/partmatchDatasource");
        connection = null;
        statement = null;
        connection = datasource.getConnection();

        } 
        catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } …
Run Code Online (Sandbox Code Playgroud)

java sql jdbc maven java-ee-6

8
推荐指数
1
解决办法
2万
查看次数

在java中将一个pojo的所有属性复制到另一个pojo?

我有一些第三方罐子的POJO,我们不能直接向客户透露.

ThirdPartyPojo.java

public class ThirdPartyPojo implements java.io.Serializable {

    private String name;
    private String ssid;
    private Integer id;

    //public setters and getters

}
Run Code Online (Sandbox Code Playgroud)

上面的类是我们正在使用的第三方jar的一部分,如下所示.

ThirdPartyPojo result = someDao.getData(String id);
Run Code Online (Sandbox Code Playgroud)

现在我们的计划是ThirdPartyPojo第三方jar的一部分,我们不能ThirdPartyPojo直接向客户发送结果类型.我们想要创建自己的pojo,它将具有与ThirdPartyPojo.java类相同的属性.我们必须将ThirdPartyPojo.java中的数据设置为OurOwnPojo.java并返回,如下所示.

public OurOwnPojo getData(String id){

    ThirdPartyPojo result = someDao.getData(String id)

    OurOwnPojo response = new OurOwnPojo(result);

    return response;

    //Now we have to populate above `result` into **OurOwnPojo** and return the same.

}
Run Code Online (Sandbox Code Playgroud)

现在我想知道是否有具有相同性质的最佳方式OurOwnPojo.javaThirdPartyPojo.java和填充数据ThirdPartyPojo.javaOurOwnPojo.java并返回相同?

public class OurOwnPojo implements …
Run Code Online (Sandbox Code Playgroud)

java java-ee-6

8
推荐指数
1
解决办法
1万
查看次数

如果没有Web层,因此没有HTTP会话,CDI是否有意义?

新的JSR 299"Java EE的上下文和依赖注入"似乎基于"范围"的概念.

创建bean并将其与受支持的Scope之一相关联:Application,Session(映射到HTTP会话),Conversation和Request.

如果没有HTTP会话(例如,通过EJB远程公开功能的企业应用程序),使用CDI是否有意义,因为托管Bean不会与任何上下文相关联(因为它们不存在)?

在这种情况下甚至可以使用CDI吗?它会带来哪些优势?

java cdi java-ee-6 ejb-3.1

7
推荐指数
1
解决办法
362
查看次数