2014-06-10 4 views
0

하나의 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)은 작동 중이거나 작동하지 않는 상태를 모두 보여줍니다.

+1

EJB를 사용하면 서비스 클래스와 LTW를 지원하지 않는 클래스 로더가로드됩니다 (EJB가 실행 된 후 컨텍스트가로드되는 즉시 활성화 됨). –

+0

어떻게 해결할 수 있습니까? websphere에서 '시작 무게'값을 변경했지만 도움이되지 않습니다. – kraken

답변

0

스프링 프레임 워크는 자체 스프링 컨테이너를 가지고 있으며 내부적으로 모든 트랜잭션을 관리하며 EJB의 필요성이 없도록 종속성 주입 및 IoC도 제공합니다. EJB를 배치 할 때 EJB 로직을 EJB에 배치 할 필요가 없습니다.

그 이유는 applicationContext.xml에 다음 태그를 추가하기 만하면됩니다. 패키지를 검사하기 위해서입니다.

+0

고마워요,하지만 더 많은 코드가있는 기존 ejb 모듈이 있고 작성한 코드를 변경하고 싶지 않습니다. 예를 들어 github 프로젝트를 만들었습니다. – kraken

관련 문제