하나의 ejb 및 하나의 war 모듈과 dao 및 서비스와 같은 다른 로컬 jar 종속성으로 구성된 귀가 있습니다. 내가ejb 모듈을 추가하면 스프링 트랜잭션이 작동하지 않습니다.
GitHub의 https://github.com/SunPj/spring-load-time-weaving에 프로젝트를 배치 한
나는 봄로드 시간 직물을 사용합니다. 내 DAO 애플리케이션 컨텍스트 라인
다음과 같은 구성<tx:annotation-driven mode="aspectj"/>
<context:load-time-weaver aspectj-weaving="on"/>
내 캐시 컨텍스트가 <cache:annotation-driven mode="aspectj"/>
내 웹 모듈은
package ru.test.web;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import ru.test.service.TestService;
import java.util.Map;
@Controller
public class TestController {
@Autowired
TestService testService;
@RequestMapping("/userlist")
public String userList(Map<String, Object> model) {
String st = ArrayUtils.toString(testService.getUsers());
model.put("text", st);
return "main";
}
@RequestMapping("/remove-user")
public String removeUser(@RequestParam("userId") int userId, Map<String, Object> model) {
testService.removeUser(userId);
model.put("text", "Removed userid = "+userId);
return "main";
}
@RequestMapping("/remove-user-ex")
public String removeUserEx(@RequestParam("userId") int userId, Map<String, Object> model) {
try {
testService.removeUserWithException(userId);
} catch (RuntimeException e){
model.put("text", "Exception = "+e.getMessage());
}
return "main";
}
@RequestMapping("/random")
public String random(Map<String, Object> model) {
String s = new String();
for (int i = 0; i< 100; i++){
s = s + +testService.getRandom()+", ";
}
model.put("text", "Random = "+s);
return "main";
}
@RequestMapping({"/", "/home"})
public String index(Map<String, Object> model) {
model.put("text", "Home page!");
return "main";
}
@RequestMapping("/user-cache-evict")
public String userCacheEvict(Map<String, Object> model) {
testService.userCacheEvict();
model.put("text", "user cache evicted!");
return "main";
}
@RequestMapping("/data-cache-evict")
public String dataCacheEvict(Map<String, Object> model) {
testService.dataCacheEvict();
model.put("text", "data cache evicted!");
return "main";
}
}
Servise이
을@Service
@Transactional
public class TestServiceImpl implements TestService {
@Autowired
private TestDao testDao;
@Override
public String getUsers() {
return testDao.showUsers() + "(real count = "+testDao.getRealUsersCount()+")";
}
@Override
public void removeUser(int userId) {
testDao.removeUser(userId);
}
@Override
public void removeUserWithException(int userId) {
testDao.removeUser(userId);
throw new RuntimeException("ololo");
}
@Override
public int getRandom() {
return testDao.getRandom();
}
@Override
public void userCacheEvict() {
testDao.userCacheEvict();
}
@Override
public void dataCacheEvict() {
testDao.dataCacheEvict();
}
@Override
public int showUsers() {
return 1;
}
}
과 같은 다오 컨트롤러를 가지고
@Repository
public class TestDaoImpl extends AbstractDao implements TestDao {
@Override
public void removeUser(int id) {
getJdbcTemplate().execute("DELETE FROM TABLE1 WHERE id = " + id);
}
@Override
public String showUsers() {
String users = ArrayUtils.toString(getJdbcTemplate().queryForList("SELECT name FROM TABLE1", String.class));
return users + ":" + getCachedUsersCount();
}
@Override
@Cacheable(value = "User")
public int getCachedUsersCount(){
int cnt = getJdbcTemplate().queryForInt("SELECT count(*)name FROM TABLE1");
return cnt;
}
@Override
public int getRealUsersCount(){
int cnt = getJdbcTemplate().queryForInt("SELECT count(*)name FROM TABLE1");
return cnt;
}
@Override
@CacheEvict(value = "User", allEntries = true)
public void userCacheEvict(){
}
@Override
@CacheEvict(value = "PermanentData", allEntries = true)
public void dataCacheEvict(){
}
@Override
@Cacheable(value = "PermanentData")
public int getRandom() {
return new Random().nextInt();
}
}
ejb에는 서비스 종속성이없는 반면, 모두 잘 작동합니다. ejb 모듈 (일부 -ejb의 pom)에 서비스 종속성을 추가하자마자 트랜잭션이 중단되었습니다.
github에서 마지막 2 개 커밋 (커밋 973f48a9e0db11edc3675fd09b6930f05b98afc9 및 커밋 e7d280cb93b2303bfcfbd5cd0b55d24b002be8fc)은 작동 중이거나 작동하지 않는 상태를 모두 보여줍니다.
EJB를 사용하면 서비스 클래스와 LTW를 지원하지 않는 클래스 로더가로드됩니다 (EJB가 실행 된 후 컨텍스트가로드되는 즉시 활성화 됨). –
어떻게 해결할 수 있습니까? websphere에서 '시작 무게'값을 변경했지만 도움이되지 않습니다. – kraken