我試過在我的Spring(v 3.1)Web應用程序中使用scala編程的一些bean,並且在交易時遇到了奇怪的問題。Scala的春季交易
我已經在Roo中設置了一個小而完整的Spring應用程序來顯示我的問題。說實話,我沒有一個線索,爲什麼它不工作做...
project --topLevelPackage com.app
jpa setup --provider ECLIPSELINK --database DERBY_EMBEDDED
entity jpa --class com.app.MyEntity
field string --fieldName title
然後,我創建的接口在Java中
package com.app;
public interface IScalaMainClass {
void doSomething();
}
package com.app;
public interface IScala1 {
void someMethod();
}
package com.app;
public interface IScala2 {
void someMethod();
}
這些實現在Scala中創建其中Scala1持續myEntity所和Scala2使得DELETE查詢:
package com.app
import org.springframework.transaction.annotation.Transactional
import org.springframework.stereotype.Repository
import org.springframework.beans.factory.annotation.Autowired
@Repository class ScalaMainClass extends com.app.IScalaMainClass {
@Autowired var bean1: IScala1 = null
@Autowired var bean2: IScala2 = null
@Transactional def doSomething() = {
bean1.someMethod()
bean2.someMethod()
}
}
package com.app
import org.springframework.stereotype.Repository
import javax.persistence.{EntityManager, PersistenceContext}
@Repository class Scala1 extends com.app.IScala1 {
@PersistenceContext var em: EntityManager = null
def someMethod = {
val e = new MyEntity
em persist e
}
}
package com.app
import org.springframework.transaction.annotation.Transactional
import org.springframework.stereotype.Repository
import javax.persistence.{EntityManager, PersistenceContext}
@Repository class Scala2 extends com.app.IScala2 {
@PersistenceContext var em: EntityManager = null
@Transactional def someMethod = {
val q = em createQuery "DELETE FROM MyEntity"
q executeUpdate
}
}
最後在Java中,測試是CR eated它執行IScalaMainClass:
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.annotation.Rollback;
import org.springframework.beans.factory.annotation.Autowired;
import org.junit.runner.RunWith;
import org.junit.Test;
import org.junit.Assert;
import com.app.IScalaMainClass;
@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(defaultRollback = false)
public class AppTest {
@Autowired private IScalaMainClass smc;
@Test public void testIt() {
smc.doSomething();
}
}
如果你現在添加斯卡拉依賴關係的pom.xml,做「MVN測試」,您將收到
javax.persistence.TransactionRequiredException:
Exception Description: No transaction is currently active
...
你需要表現出更多的代碼,你怎麼稱呼'DoSomething的()' ,它是一些特性的一部分('IScalaMainClass'),你如何配置@Transactional(XML?),你能顯示*沒有正在進行的事務*異常的線程轉儲嗎?如何構建應用程序(在啓動期間未能找到類)。我可以向你保證,斯卡拉與Spring完美合作。 – 2012-07-10 12:06:04
我現在已經用完整的示例擴展了我的原始內容,以便您可以逐步重建問題 – rainerhahnekamp 2012-07-12 10:24:19