Spring Autowiring gagal saat menggunakan Cobertura

Saat saya menjalankan Cobertura, hal ini menyebabkan kesalahan pengkabelan otomatis Spring berikut:

Disebabkan oleh: org.springframework.beans.factory.BeanCreationException: Kesalahan saat membuat kacang dengan nama 'userResource': Injeksi dependensi kabel otomatis gagal; pengecualian bersarang adalah org.springframework.beans.factory.BeanCreationException: Tidak dapat melakukan autowire bidang: private com.dnb.components.storage.service.UserService com.dnb.components.storage.rest.resource.UserResource.userService; pengecualian bersarang adalah java.lang.IllegalArgumentException: Tidak dapat menyetel bidang com.dnb.components.storage.service.UserService com.dnb.components.storage.rest.resource.UserResource.userService ke com.sun.proxy.$Proxy56 di org .springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)


Seperti yang disarankan dalam postingan terkait lainnya, saya mencoba memaksa Spring untuk menggunakan CGLIB dengan mengubah "proxyTargetClass=true", tetapi ini menghasilkan kesalahan yang berbeda:

Disebabkan oleh: org.springframework.beans.factory.BeanCreationException: Kesalahan saat membuat kacang dengan nama 'userResource': Injeksi dependensi kabel otomatis gagal; pengecualian bersarang adalah org.springframework.beans.factory.BeanCreationException: Tidak dapat melakukan autowire bidang: private com.dnb.components.storage.service.UserService com.dnb.components.storage.rest.resource.UserResource.userService; pengecualian bersarang adalah org.springframework.beans.factory.BeanCreationException: Kesalahan saat membuat kacang dengan nama 'userService': Injeksi dependensi kabel otomatis gagal; pengecualian bersarang adalah org.springframework.beans.factory.BeanCreationException: Tidak dapat melakukan autowire bidang: com.dnb.components.storage.repository.UserRepository com.dnb.components.storage.service.UserService.repository; pengecualian bersarang adalah org.springframework.beans.factory.BeanCreationException: Kesalahan saat membuat kacang dengan nama 'userRepository': Pasca-pemrosesan objek FactoryBean gagal; pengecualian bersarang adalah org.springframework.aop.framework.AopConfigException: Tidak dapat menghasilkan subkelas CGLIB dari kelas [kelas com.sun.proxy.$Proxy54]: Penyebab umum masalah ini termasuk penggunaan kelas final atau kelas yang tidak terlihat; pengecualian bersarang adalah java.lang.IllegalArgumentException: Tidak dapat membuat subkelas kelas akhir com.sun.proxy.$Proxy54

Seperti inilah tampilan kelas Repositori:

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

    public User findByCrmId(String crmIdId);
}

Berikut adalah layanan yang disuntikkan dengan 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);
    }
}

Konfigurasi kita sudah masuk

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

....

(dihilangkan agar singkatnya)

Sumber Daya Pengguna.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;

...

Tampaknya kelas Repositori yang dihasilkan Spring Data JPA tidak dapat diproksi dengan cara apa pun tanpa mengacaukan pengkabelan otomatis.

Apakah ada perbaikan untuk ini? Apakah merupakan ide bagus untuk membubuhi keterangan metode Repositori dengan @Transaksional? Haruskah anotasinya hanya pada tingkat layanan?


person Nate Reed    schedule 25.06.2013    source sumber
comment
Tunjukkan kepada kami deklarasi bidang com.dnb.components.storage.rest.resource.UserResource.userService   -  person Jukka    schedule 25.06.2013


Jawaban (1)


biasanya, kami tidak memasukkan kelas konkret tetapi kami memasukkan antarmuka. ini saranku.

A. refactor UserService ke kelas UserServiceImpl

B. membuat antarmuka UserService

C. UserServiceImpl mengimplementasikan UserService

D. tambahkan deklarasi metode "findAll" dan "findOne" ke antarmuka UserService

person Titi Wangsa Bin Damhore    schedule 19.11.2013