无法在SpringBoot应用程序中使用JPA在数据库中保存数据

时间:2018-08-05 07:23:41

标签: java spring-boot spring-data-jpa spring-webflux

我正在使用JDK 1.8,Spring 5和SpringBoot 2.0开发基于微服务的Java应用程序。我在申请CRUD时使用了JPA。我有以下方法来更新数据库(PostGres)中具有购物车ID的现有记录:-

@Override
@CachePut(value = CommerceConnectorConstants.CommerceCache.COMMERCE_CACHE_TENANT_USER_DATA_MAP)
public Mono<CommerceTenantUser> updateCartId(String tenantId, String userId, String cartId) {
    logger.info("cartId->"+cartId);

    final TenantUserKey commerce = getCommerceObj(tenantId, userId);
    Optional <CommerceTenantUser> tenantUser = commerceTenantUserRepository.findById(commerce);

    return tenantUser.map(tenantUserObj -> updateCartIdAndRefreshMap(tenantUserObj, cartId)).orElse(Mono.empty());

}

private Mono<CommerceTenantUser> updateCartIdAndRefreshMap(CommerceTenantUser tenantUserObj, String cartId) {
    tenantUserObj.setCartId(cartId);

    final Mono<CommerceTenantUser> commerceTenantUser = asyncRunner
            .one(() -> commerceTenantUserRepository.saveAndFlush(tenantUserObj))
            .doOnNext(value -> commerceCacheService.refreshMap())
            .doOnError(error -> logger.error("Error while persisting Cart Id: {}", error))
            .map(commerceTenantUserObj -> commerceTenantUserObj);

    return commerceTenantUser;

}

我的问题在于应用程序流程之一,我无法更新购物车ID。我尝试了多次调试流程,可以清楚地看到此方法正在发生调用,并且我也可以在控制台中记录购物车ID值,但最终从未真正更新购物车ID发生在数据库中。 请注意,在其他应用程序流中也使用了相同的方法来更新购物车ID,其中购物车ID最终保存在数据库中(我的流程除外),所以我想保存的实现逻辑没有问题。

以下是发生此方法调用但未保存在数据库中的流程:-

@Override   public Mono verifyCredentialsforBasicAuthorization(Map requestInfo){

Tuple4<String, String, WebClient, String> serviceConnectionDetails = commerceConnectorHelper.verifyCredentialsforBasicAuthorization(requestInfo);

if(!StringUtils.isBlank(serviceConnectionDetails._1)) {
    logger.info("Calling cart id update service...");

       return serviceConnectionDetails._3
    .post()
         .uri(builder -> builder.path(serviceConnectionDetails._1)
             .queryParam(CommerceConnectorConstants.CartParams.OLD_CART_ID, serviceConnectionDetails._4)
             .build())
    .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
    .retrieve()
    .bodyToMono(CartModel.class)
         .map(response ->
         {
           return repositoryDetails.updateCartId(requestInfo.get(CommerceConnectorConstants.HttpHeaders.TENANT_ID).get(),
               requestInfo.get(CommerceConnectorConstants.HttpHeaders.TENANT_USER_ID).get(), response.getGuid()).then(Mono.just(response));
         }) .then(repositoryDetails.updateCommerceUserId(requestInfo.get(CommerceConnectorConstants.HttpHeaders.TENANT_ID).get(),
             requestInfo.get(CommerceConnectorConstants.HttpHeaders.TENANT_USER_ID).get(),
             requestInfo.get(CommerceConnectorConstants.AuthorizationParams.AUTHORIZATION_USERNAME).get()))

     .then(serviceConnectionDetails._3
         .get()
         .uri(serviceConnectionDetails._2)
         .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
         .retrieve()
         .bodyToMono(UserProfile.class)
         .doOnNext(value -> logger.info("Called User Profile service {}", value.getCustomerId()))
         .doOnError(error -> logger.error("Error while calling User Profile service: {}", error)));


}
else
//Update Commerce User Id
;

//User Profile Call
return serviceConnectionDetails._3
    .get()
    .uri(serviceConnectionDetails._2)
    .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
    .retrieve()
    .bodyToMono(UserProfile.class)
    .doOnNext(value -> logger.info("Called User Profile service {}", value.getCustomerId()))
        .doOnError(error -> logger.error("Error while calling User Profile service: {}", error));

}

如果您注意到,我将调用此方法 repositoryDe​​tails.updateCartId ,并使用 response.getGuid()传递所有必需的参数,包括购物车ID。该方法最后执行,但最终不会将数据保存在表中。我非常努力,但无法找出问题所在。这是使用Java Reactive编程进行异步调用的问题。如果您能帮助我解决问题,我将不胜感激。谢谢

1 个答案:

答案 0 :(得分:1)

我找到了它的根本原因。我想只使用JPA在同一实体上调用一次update。以我为例,我分别调用两次以更新同一实体中的2个不同的列。

相关问题