我有一个包含大量JAR的EAR文件,其中一个JAR包含Local Session Beans(EJB3).我需要从非托管POJO中执行这些会话Bean的JNDI查找,这些POJO也包含在EAR中(在这种情况下也与EJB中的JAR相同).我尝试了遵循Glassfish EJB FAQ,但无论我尝试什么,我都会继续收到javax.naming.NameNotFoundException.
我不确定一些事情.我应该在哪里放置我的ejb-jar.xml(我尝试过EARs META-INF以及JARs META-INF)?我需要sun-ejb-jar.xml吗?究竟什么是ejb-link,它做了什么?我可能做错了什么(我的配置几乎与常见问题解答中给出的本地查找相同)?
我列出了我尝试的一些配置和结果如下:
<enterprise-beans>
<session>
<ejb-name>ITestBean</ejb-name>
<ejb-class>com.test.TestBean</ejb-class>
<ejb-local-ref>
<ejb-ref-name>ITestBean</ejb-ref-name>
<local>com.test.ITestBean</local>
</ejb-local-ref>
</session>
</enterprise-beans>
Run Code Online (Sandbox Code Playgroud)
应用程序部署但JNDI查找返回null.
<enterprise-beans>
<session>
<ejb-name>ITestBean</ejb-name>
<ejb-class>com.test.TestBean</ejb-class>
<ejb-local-ref>
<ejb-ref-name>ITestBean</ejb-ref-name>
<local>com.test.ITestBean</local>
<ejb-link>ITestBean</ejb-link>
</ejb-local-ref>
</session>
</enterprise-beans>
Run Code Online (Sandbox Code Playgroud)
应用程序未部署:无法确定EJB 3.0 ref的未解决的Ejb-Ref ITestBean @ jndi的本地业务与远程业务指定.
<enterprise-beans>
<session>
<ejb-name>ITestBean</ejb-name>
<ejb-class>com.test.TestBean</ejb-class>
<ejb-local-ref>
<ejb-ref-name>ITestBean</ejb-ref-name>
<local>com.test.ITestBean</local>
<ejb-link>MyJar.jar#ITestBean</ejb-link>
</ejb-local-ref>
</session>
</enterprise-beans>
Run Code Online (Sandbox Code Playgroud)
应用程序未部署:错误:未解决:MyJar.jar#ITestBean.
<enterprise-beans>
<session>
<ejb-name>ITestBean</ejb-name>
<local>com.test.ITestBean</local>
<ejb-local-ref>
<ejb-ref-name>ITestBean</ejb-ref-name>
</ejb-local-ref>
</session>
</enterprise-beans>
Run Code Online (Sandbox Code Playgroud)
处理EjbDescriptor时出错
我有两个输入,它们一起形成一个单一的语义单元(想想小时和分钟输入一起形成时间输入)。如果两个输入都失去焦点,我想调用一些 Javascript 函数,但如果用户只是在这两个输入之间跳转,我不想触发任何东西。
我试过将这两个输入包装在一个 div 中并向 div 添加一个 onBlur,但它永远不会触发。
接下来我尝试将 onBlurs 添加到两个输入并让它们通过 jQuery 检查另一个的 :focus 属性,但似乎当 onBlur 触发下一个元素还没有收到焦点。
关于如何实现这一目标的任何建议?
编辑:有人质疑这样做的目的。我想根据这两个输入包含的值更新其他一些字段,但理想情况下,如果用户仍在更新第二个输入的过程中(例如,如果从第一个输入到第二个输入的用户选项卡)。
我需要允许客户端用户在运行时扩展 JPA 实体包含的数据。换句话说,我需要在运行时向实体表添加一个虚拟列。此虚拟列仅适用于某些数据行,并且可能存在相当多的此类虚拟列。因此,我不想在数据库中创建实际的附加列,而是想利用表示这些虚拟列的附加实体。
例如,请考虑以下情况。我有一个Company实体,它有一个标签为Owner的字段,其中包含对公司所有者的引用。在运行时,客户端用户决定属于特定所有者的所有公司都应具有标记为ContactDetails的额外字段。
我的初步设计使用两个额外的实体来实现这一点。第一个基本上代表虚拟列,包含字段名称和预期值类型等信息。另一个代表实际数据并将实体行连接到虚拟列。例如,第一个实体可能包含数据“ContactDetails”,而第二个实体可能包含“555-5555”。
这是做这件事的正确方法吗?有更好的选择吗?另外,在加载原始实体时自动加载此数据的最简单方法是什么?我希望我的 DAO 调用返回实体及其扩展。
编辑:我从外地标记改变的例子类型可以是一个合作伙伴或客户,以目前的版本,因为它混淆了。
我正在创建一个具有一些管理屏幕的Web应用程序,用户可以在其中编辑记录(例如,更改用户的联系人详细信息).对这些管理屏幕的访问由角色控制,多个用户可能具有访问权限.现在出现的问题是如果两个用户同时尝试编辑同一记录该怎么办.
我的问题在于前端,而不是后端.我可以使用哪些模式来设计我的页面,以便用户友好并防止并发修改?我能想到的唯一两个选择是这些:
有什么建议?
我的问题将是一个简化的例子(在 Java 中):
public class VehicleRepository {
// DAOs responsible for fetching objects from data store (injected)
private IChassisDAO chassisDAO;
private IEngineDAO engineDAO;
private IWheelDAO wheelDAO;
private IAccessoryDAO accessoryDAO;
public Vehicle getLuxuryCar() {
VehicleBuilder builder = getVehicleBuilder();
builder.setChassis(chassisDAO.findBySize(ChassisSize.NORMAL));
builder.setEngine(engineDAO.findByPower(EnginePower.HIGH));
builder.setWheelTemplate(wheelDAO.findBySize(WheelSize.NORMAL));
builder.setAccessories(accessoryDAO.findByType(Accessory.LUXURY));
return builder.build();
}
public Vehicle getOffroadCar() {
VehicleBuilder builder = getVehicleBuilder();
builder.setChassis(chassisDAO.findBySize(ChassisSize.LARGE));
builder.setEngine(engineDAO.findByPower(EnginePower.HIGH));
builder.setWheelTemplate(wheelDAO.findBySize(WheelSize.LARGE));
return builder.build();
}
// Similar operations ...
}
Run Code Online (Sandbox Code Playgroud)
你会如何对这个类进行单元测试?我想了一会儿,我已经确定了几个选项:
在不模拟构建器的情况下测试返回的 Vehicle
从接口的角度来看,这是最好的选择,但它不会是 VehicleRepository 上的孤立单元测试。与仅测试 VehicleBuilder 相比,我看不出将 VehicleRepository 与 VehicleBuilder 一起测试有什么真正的好处。VehicleBuilder 也可能具有复杂的逻辑(例如检查存在哪些附件),这会导致多个执行路径,这将使 VehicleRepository 的测试变得非常复杂。
重构代码以测试构建器的状态
一个示例是将 …
我们的生产系统经常出现明显的僵局,我们似乎无法深入到底.我们无法跟踪在线用户数量的任何相关性,似乎我们的可用连接不足.
我们有一个Java EE应用程序通过Hibernate和c3p0连接到Oracle.我们的c3p0配置是:
minPoolSize=10
maxPoolSize=300
initialPoolSize=30
acquireIncrement=10
maxIdleTime=1800
maxStatementsPerConnection=0
numHelperThreads=5
Run Code Online (Sandbox Code Playgroud)
明显的死锁日志输出总是看起来或多或少像这样:
[com.mchange.v2.async.ThreadPoolAsynchronousRunner] (Timer-1) com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@4c9f1b4d -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 5
Active Threads: 5
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7fe1ab86 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@38c42c01 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@572512c4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@42f32e8e (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@6b758ef8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#3)
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@72fd72e5
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@5d82535d
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@172f2ea1
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1a9e57eb
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@20ee5a35
Run Code Online (Sandbox Code Playgroud)
实际的池线程堆栈跟踪有所不同,我在下面添加了一些示例:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4,5,jboss]
java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:45)
java.lang.StringBuilder.<init>(StringBuilder.java:80)
oracle.net.ns.Packet.<init>(Packet.java:513)
oracle.net.ns.ConnectPacket.<init>(ConnectPacket.java:64)
oracle.net.ns.NSProtocol.connect(NSProtocol.java:278)
oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042)
oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301)
oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221)
oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,jboss]
oracle.jdbc.driver.T4CTTIoauthenticate.processRPA(T4CTTIoauthenticate.java:491)
oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:295)
oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:390)
oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:356)
oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221)
oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:1
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,jboss]
oracle.net.ns.NSProtocol.connect(NSProtocol.java:346)
oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042)
oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301)
oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221) …Run Code Online (Sandbox Code Playgroud) 我们是否应该针对DRY,在某种意义上,功能的变化会影响尽可能少的代码,在编写单元测试时,我们的可预测性,即代码的操作是微不足道的?基本上我要问的是创建辅助方法之间的权衡,这些方法非常通用,可以由多个单元测试使用,而不是只将测试代码限制在单个单元测试中.举个例子来看一个具有以下方法签名的工厂:
public Node buildNode(String path, String name, Map<String, Object> attributes);
Run Code Online (Sandbox Code Playgroud)
根据提供的参数,生成的Node对象将不同,因此我们需要测试不同的可能性.如果我们的目标是可预测性,我们可能会编写第一个示例中给出的两个独立的单元测试,但如果我们的目标是DRY,我们宁愿添加一个常见的辅助方法,例如在第二个示例中:
EXAMPLE1:
@Test
public void testBuildBasicNode() {
Node node = testee.buildNode("/home/user", "Node", null);
assertEquals("/home/user/Node", node.getAbsolutePath());
assertEquals(false, node.isFolder());
}
@Test
public void testBuildAdvancedNode() {
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put("type", NodeType.FOLDER);
Node node = testee.buildNode("/home/user", "Node", attributes);
assertEquals("/home/user/Node", node.getAbsolutePath());
assertEquals(true, node.isFolder());
}
EXAMPLE2:
@Test
public void testBuildBasicNode() {
Node node = testee.buildNode("/home/user", "Node", null);
Node comparisonNode = buildComparisonNode("/home/user", "Node", null);
assertEquals(comparisonNode, node);
}
@Test
public void testBuildAdvancedNode() {
Map<String, …Run Code Online (Sandbox Code Playgroud) 我有两个分支,它们有效地包含相同的文件,但由于遗留原因它们是分开的.称他们为A和B.
如果我运行git log --oneline A ^BGit输出114提交,这是预期的.
然后我可以git merge -s ours --allow-unrelated-histories A在分支B上运行,它向Git指示A已经合并到B而没有对结束文件状态进行任何更改.这是有效的,除了B现在接收这114个提交作为其历史的一部分(git log).
如何在不引入A的所有历史记录的情况下将A标记为合并到B?
我试过git merge --squash -s ours --allow-unrelated-histories A跟着git commit,但这没有任何影响.
概念上压缩-s ours提交应该给我我想要的东西,但它不起作用.
我有一个Web应用程序部署到本地Glassfish服务器,我想分析,以便查看我的代码的哪些部分最常访问.该代码由JSF bean和远程EJB组成,两者都部署在单个EAR中.我尝试使用VisualVM来分析我的应用程序,但是,尽管我可以成功连接到Glassfish服务器以及我的上下文根,但VisualVM似乎并不会分析我自己的类(在com.test.*命名空间中).我看到很多Sun类和其他依赖项如Lucene被访问,但不是我自己的类的单个实例.
我的问题是:我做错了什么,或者这是VisualVM的一个缺点,我应该尝试使用不同的分析工具吗?
有没有人知道一个网站,新闻组,留言板等,我可以提交一些我的Scala代码让经验丰富的Scala开发人员"审查"它?代码工作和诸如此类的东西,但我真的想学习在编写Scala时更加惯用,而且我常常发现自己正在回归更加迫切的开发,因为我找不到"更好的方法".