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?