java - 使用 @Transactional 时未从其余服务返回数据
问题描述
我创建了一个示例酒店预订应用程序,我有 2 个服务,一个是预订服务,另一个是查看预订,我在内存 DB H2 中使用。
当我尝试使用预订服务的预订 URL 预订房间时,会发生预订(返回 200 OK),但使用时未返回预订数据@Transactional
。如果我删除它工作正常@Transactional
(返回 200 OK 以及预订数据)
BookingServiceImpl
package com.reservation.hotel.service.impl;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import com.reservation.hotel.data.repositories.ReservationRepository;
import com.reservation.hotel.data.repositories.RoomRepository;
import com.reservation.hotel.domain.RoomReservation;
import com.reservation.hotel.domain.entities.Reservation;
import com.reservation.hotel.domain.entities.Room;
import com.reservation.hotel.service.BookingService;
@Service
public class BookingServiceImpl implements BookingService{
@Autowired
ReservationRepository reservationRepository;
@Autowired
RoomRepository roomRepository;
private static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd-MM-yyyy");
private static final String getReservationsByGuestIdURL = "http://localhost:8088/hotel/reservations/guest/";
@Transactional
public List<RoomReservation> bookRoom(String roomId, String guestId, String date){
//List<RoomReservation> reservations= new ArrayList<>();
//change status of booked room to true
Optional<Room> room = roomRepository.findById(Long.parseLong(roomId));
room.get().setBooked(true);
roomRepository.save(room.get());
Reservation reservation = new Reservation();
reservation.setGuestId(Long.parseLong(guestId));
reservation.setRoomId(Long.parseLong(roomId));
reservation.setDate(new java.sql.Date(createDateFromDateString(date).getTime()));
reservationRepository.save(reservation);
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(getReservationsByGuestIdURL + guestId, List.class);
}
private Date createDateFromDateString(String dateString){
Date date = null;
if(null!=dateString) {
try {
date = DATE_FORMAT.parse(dateString);
}catch(ParseException pe){
date = new Date();
}
}else{
date = new Date();
}
return date;
}
}
@Transactional
使用for时我得到一个空的响应
return restTemplate.getForObject(getReservationsByGuestIdURL + guestId, List.class);
你能解释一下这里发生了什么吗?
解决方案
推荐阅读
- javascript - Selenium Click 在大多数情况下都不起作用 - 元素被突出显示但点击不起作用并且页面 scolls - WebdriverException
- google-cloud-platform - 无法从 Compute Engine 访问 BigQuery
- c# - 如何在 Cypher Query 的 where IN 子句中使用 int[](使用 C#)
- c++ - cmake - 找不到共享库的头文件
- php - Laravel PHP8 Coverage 无法识别具有提升属性的构造函数
- excel - 如何隐藏开发人员选项卡
- zip - 当该文件不在中央目录中但有自己的 LFH 时,是否有从 ZIP 存档中提取文件的工具?
- javascript - 重构 Object.keys(object).map 以获取嵌套数组值。JavaScript
- javascript - axios.get forEach 仅显示 1 个结果
- node.js - socketio 失败:在生产环境建立连接之前关闭 WebSocket