我正在使用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));
}
如果您注意到,我将调用此方法 repositoryDetails.updateCartId ,并使用 response.getGuid()传递所有必需的参数,包括购物车ID。该方法最后执行,但最终不会将数据保存在表中。我非常努力,但无法找出问题所在。这是使用Java Reactive编程进行异步调用的问题。如果您能帮助我解决问题,我将不胜感激。谢谢
答案 0 :(得分:1)
我找到了它的根本原因。我想只使用JPA在同一实体上调用一次update。以我为例,我分别调用两次以更新同一实体中的2个不同的列。