我有一个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的东西(因为它对某些设置有用,以避免重新编译)?
我有一个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实现中的错误?
我一直发现我已经存在的事务是在标记的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关闭会议?
更新: 我相信我的上述假设是正确的,但我的观察有点偏.请参阅下面的我自己提供的答案.
当我在eclipse中创建一个新的Java EE 6项目时,我看到了许多类型的项目....
这些不同的类型是什么?它们是什么意思?
我对以下情况中使用哪个有点困惑:
假设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) 我使用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) 我能够在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 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) 我有一些第三方罐子的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.java是ThirdPartyPojo.java和填充数据ThirdPartyPojo.java来OurOwnPojo.java并返回相同?
public class OurOwnPojo implements …Run Code Online (Sandbox Code Playgroud) 新的JSR 299"Java EE的上下文和依赖注入"似乎基于"范围"的概念.
创建bean并将其与受支持的Scope之一相关联:Application,Session(映射到HTTP会话),Conversation和Request.
如果没有HTTP会话(例如,通过EJB远程公开功能的企业应用程序),使用CDI是否有意义,因为托管Bean不会与任何上下文相关联(因为它们不存在)?
在这种情况下甚至可以使用CDI吗?它会带来哪些优势?