1
resposta

@Transactional não funciona corretamente com kotlin

Eu tenho um projeto que estava convertendo partes para kotlin, nesse projeto eu tenho um useCase de criar unidade, porém quando eu coloco o @Transactional em cima de um método eu tenho o seguinte erro:

Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class br.senai.sp.sgjd.application.usecases.unities.CreateUnityUseCase: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class br.senai.sp.sgjd.application.usecases.unities.CreateUnityUseCase

class:

@Component
class CreateUnityUseCase(
    private val repository: UnityRepository,
    private val mapper: UnityBoundaryMapper
) {

    @Transactional
    fun execute(input: CreateUnityRequest): Unity {
        validateDuplicateResource(input)
        val unity = mapper.toEntity(input)
        return repository.save(unity)
    }

    private fun validateDuplicateResource(input: CreateUnityRequest) {
        val alreadyExists = repository.findByNameOrCode(input.name, input.code).isPresent
        if (alreadyExists) throw DuplicatedResourceException(Unity::class.java)
    }
}

e se eu marcar a classe como open no hora que faz a chamada pro repository da null pointer como se o repository n fosse injetado direito, mas não faz sentido eu ter que marcar essa classe como open, help alguém!!

1 resposta

Olá Kaique, tudo bem?

Pelo que entendi, você está enfrentando um problema ao utilizar a anotação @Transactional em um método de uma classe em Kotlin. O erro que está aparecendo indica que a classe não pode ser final, o que pode estar impedindo a criação de uma subclasse CGLIB.

Uma possível solução para esse problema é adicionar a dependência do CGLIB no seu projeto.

Quanto ao problema que você mencionou quando marca a classe como "open", pode ser que você precise verificar se a injeção de dependência está sendo feita corretamente. Verifique se a classe do repositório está sendo corretamente anotada com "@Repository" e se a configuração do Spring está sendo feita corretamente.

Espero ter ajudado e bons estudos!