2014-07-21 3 views
0

현재 Spring 및 Hibernate 응용 프로그램에서 작업 할 때 또 다른 문제점이 있습니다. 내 DAO 인터페이스/클래스뿐만 아니라 내 서비스 인터페이스/클래스 물론 엔터티를 빌드했습니다.Spring/Hibernate 응용 프로그램은 @ Transactional 없이만 작동합니다.

모든 것이 잘 전개되고 있지만 최대한 빨리 내 XXXServiceImpl 클래스에 @Transactional 주석을 추가 할 때, 내가 배포 과정에서 다음과 같은 예외가 (글래스 피시와 톰캣 테스트) : 물론

Caused by: java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy25 implementing net.dreamcode.bleevle.persistence.service.IntranetService,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.dreamcode.bleevle.persistence.service.impl.IntranetServiceImpl] for property 'intranetService': no matching editors or conversion strategy found 

, 나는 시도 그것에 대해 뭔가를 찾을 수 있습니다. 기본적으로 인터페이스와 클래스가 주석을 추가 할 때 일치하지 않기 때문입니다. 하지만 인터페이스에 주석을 추가하려고 시도했는데 문제 해결에 도움이되지 않아 위에서 언급 한 것과 같은 오류가 발생했습니다.

BasicService (인터페이스) :

public interface BasicService<T> { 

    T findById(String id); 
    void create(T entity); 
    void delete(T entity); 
    void update(T entity); 

} 

UserService (인터페이스) :

import net.dreamcode.bleevle.data.User; 

public interface UserService extends BasicService<User> { 

    User findByName(String name); 

} 
다음

내 프로젝트 ( BasicService, UserServiceUserServiceImpl)에서 몇 가지 예제 코드입니다

UserServiceImpl (클래스) :

public class UserServiceImpl implements UserService { 

    @Autowired 
    UserDao userDao; 

    @Override 
    public User findByName(String name) { 
     return userDao.findByName(name); 
    } 

    @Override 
    public User findById(String id) { 
     return userDao.findById(id); 
    } 

    @Override 
    public void create(User entity) { 
     userDao.create(entity); 
    } 

    @Override 
    public void delete(User entity) { 
     userDao.delete(entity); 
    } 

    @Override 
    public void update(User entity) { 
     userDao.update(entity); 
    } 

    public UserDao getUserDao() { 

     return userDao; 
    } 

    public void setUserDao(UserDao userDao) { 

     this.userDao = userDao; 
    } 
} 

패턴 이런 종류의 (나는 그것이 서비스 및 다오 재료와 디자인 패턴의 어떤 것 같아요)로 작업 할 때 할 수있는 특정 일이 있습니까?

모든 종류의 도움을 주시면 감사하겠습니다. 미리 감사드립니다!

답변

2

당신은 누구 형 서비스의 구현 유형 (예 : 주석 생성자 파라미터 또는 세터 또는 그 등가) 속성

@Autowired private IntranetServiceImpl intranetService; 

있다. 이것은 틀린 것입니다. 항상 속성에 대해 인터페이스 유형을 사용해야합니다.

@Transactional으로 주석을 달고 빨리 실패하는 이유는이 주석으로 인해 스프링이 인터페이스의 동적 프록시를 생성하게되고 그렇지 않은 경우 구현 된 클래스 인스턴스가있을 것이기 때문입니다. 이 동적 프록시는 임 플리 멘 테이션 유형으로 다운 캐스팅되지 않지만 인터페이스 유형으로 성공적으로 캐스팅됩니다.

+0

대단히 감사합니다. 내 클래스에 IntranetServiceImpl 속성이 없다고하더라도 setter는 매개 변수로 구현되어 있습니다. 이제 MySQL과 다른 오류가 발생하지만 직접 고칠 수 있다고 생각합니다. 다시 한 번 감사드립니다! – MrPixelDream

관련 문제