Когда я запускаю 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? Должна ли аннотация быть только на уровне обслуживания?