Ошибка Spring Autowiring при использовании Cobertura

Когда я запускаю Cobertura, это вызывает следующую ошибку автоподключения Spring:

Вызвано: org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем userResource: не удалось ввести автоматически подключенные зависимости; вложенное исключение - org.springframework.beans.factory.BeanCreationException: не удалось автоматизировать поле: private com.dnb.components.storage.service.UserService com.dnb.components.storage.rest.resource.UserResource.userService; вложенное исключение - java.lang.IllegalArgumentException: не удается установить поле com.dnb.components.storage.service.UserService com.dnb.components.storage.rest.resource.UserResource.userService в com.sun.proxy. $ Proxy56 в org .springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcessor.java:287)


Как было предложено в других связанных сообщениях, я попытался заставить Spring использовать CGLIB, изменив «proxyTargetClass = true», но это привело к другой ошибке:

Вызвано: org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем userResource: не удалось ввести автоматически подключенные зависимости; вложенное исключение - org.springframework.beans.factory.BeanCreationException: не удалось автоматизировать поле: private com.dnb.components.storage.service.UserService com.dnb.components.storage.rest.resource.UserResource.userService; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем userService: не удалось ввести автоматически подключенные зависимости; вложенное исключение - org.springframework.beans.factory.BeanCreationException: не удалось автоматически подключить поле: com.dnb.components.storage.repository.UserRepository com.dnb.components.storage.service.UserService.repository; вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем userRepository: Пост-обработка объекта FactoryBean завершилась неудачно; вложенное исключение - org.springframework.aop.framework.AopConfigException: не удалось создать подкласс CGLIB класса [class com.sun.proxy. $ Proxy54]: общие причины этой проблемы включают использование последнего класса или невидимого класса; вложенное исключение - java.lang.IllegalArgumentException: невозможно создать подкласс класса окончательного класса com.sun.proxy. $ Proxy54

Вот как выглядит класс Repository:

@Transactional
public interface UserRepository extends CrudRepository<User, Long> {

    public User findByCrmId(String crmIdId);
}

Вот сервис, который вводится с помощью UserRepository:

@Service
@Transactional
public class UserService extends TraceablePersistenceService<User, UserRepository> {

    @Autowired
    UserRepository repository;

    @Transactional
    public Iterable<User> findAll() {
        return repository.findAll();
    }

    public User findOne(Long id) {
        return repository.findOne(id);
    }
}

Наша конфигурация находится в

@Configuration
@EnableTransactionManagement(proxyTargetClass=true)
@EnableJpaRepositories(basePackages = {"com.dnb.components.storage.repository"})
@Profile("inmemory")
public class InMemoryStandaloneStorageConfig extends BasicJpaStorageConfig {

....

(опущено для краткости)

UserResource.java:

@Component
@Path(UserResource.uri)
public class UserResource extends AbstractResource {
    public final static String uri = BASE_URI + "/users";

    @Override
    public String getURI() {
        return BASE_URI + uri;
    }

    @Autowired
    private UserService userService;

...

Кажется, что класс репозитория, созданный Spring Data JPA, не может быть проксирован в любом случае без нарушения автоматической проводки.

Это можно как-то исправить? Можно ли вообще аннотировать методы репозитория с помощью @Transactional? Должна ли аннотация быть только на уровне обслуживания?


person Nate Reed    schedule 25.06.2013    source источник
comment
Покажите нам объявление поля com.dnb.components.storage.rest.resource.UserResource.userService   -  person Jukka    schedule 25.06.2013


Ответы (1)


обычно мы не внедряем конкретные классы, а внедряем интерфейсы. это мое предложение.

а. рефакторинг UserService в класс UserServiceImpl

б. создать интерфейс UserService

c. UserServiceImpl реализует UserService

d. добавить объявление методов findAll и findOne в интерфейс UserService

person Titi Wangsa Bin Damhore    schedule 19.11.2013