首页 > 解决方案 > 在使用 webflux 但不使用 JPA 发出请求时,已经为绑定到线程的键值 [org.springframework.orm.jpa.EntityManagerHolder@64fcf46a]

问题描述

我是 webflux 的新手,我正在尝试使用 Mono 创建一个控制器。问题是,当我尝试返回 Mono 时,出现以下异常。

已绑定到线程 [http-nio-8080-exec-2] 的键 [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@21708736] 的值 [org.springframework.orm.jpa.EntityManagerHolder@64fcf46a]

这是导致问题的代码片段。

控制器

@RestController
@Slf4j
@Getter(AccessLevel.PRIVATE)
@RequestMapping(ConsultaCNDRoutes.CONSULTA_CND_BASE_ROUTE)
public class ConsultaCNDRest extends RestControllerAuditedBase {

    private ConsultaCNDService consultaCNDService;
    
    @Autowired
    public ConsultaCNDRest(ConsultaCNDService consultaCNDService) {
        this.consultaCNDService = consultaCNDService;
    }
    
    @ApiOperation("Checa a disponibilizacao do servico")
    @GetMapping(value = ConsultaCNDRoutes.CONSULTA_CND_STATUS_ROUTE,
            produces = "application/json")
    public Mono<String> checarServicoConsultaCND() {
        try {
            Mono<String> status = consultaCNDService.consultarServicoCNDStatus();
            return status;
        } catch (CNDServicoNaoDisponivelException e) {
            log.error(e.getMessage());
            return Mono.just(e.getMessage());
        }
    }
    
}

服务

@Service
@Slf4j
@Getter(AccessLevel.PRIVATE)
public class ConsultaCNDServiceImpl implements ConsultaCNDService {

    @Value("${serpro.acesso.token}")
    private String token;

    private WebClientService webClientService;
    private CertidaoCNDService certidaoCNDService;
    
    @Autowired
    public ConsultaCNDServiceImpl(WebClientService webClientService, CertidaoCNDService certidaoCNDService) {
        this.webClientService = webClientService;
        this.certidaoCNDService = certidaoCNDService;
    }
    
    @Override
    public Mono<String> consultarServicoCNDStatus() {
        return Mono.just("HAHAHAHAHAHAHAHAHAHAHAHAHAHA"); //webClientService.getRequest(SerproRoutes.CNDRoutes.STATUS_ROUTE, token);
    }

    @Override
    public CertidaoCNDResponse consultarCertidaoCND(ConsultaCertidaoCNDRequest request) {
        // TODO Auto-generated method stub
        return null;
    }

}

网络客户端

@Override
public Mono<String> getRequest(String url, String token) {
    RequestHeadersSpec<?> responseSpec = client.get().uri(url).header("Authorization", token);
    
    Mono<String> serviceResponse = responseSpec.exchangeToMono(r -> {
        if (r.statusCode().equals(HttpStatus.OK)) {
            return r.bodyToMono(String.class);
        } else {
            return r.createException().flatMap(Mono::error);
        }
    });
    
    return serviceResponse;
}

请注意,其中没有引用任何 JPA,但我们使用 JPA 和 Hibernate 来实现持久性。我究竟做错了什么?

标签: javaspringjpaspring-webflux

解决方案


推荐阅读