Java 使用@Transactional时未从rest服务返回数据
我已经创建了一个示例酒店预订应用程序 我有两个服务,一个是预订服务,另一个是查看预订,我使用内存中的DB H2 当我尝试使用预订服务的预订URL预订房间时,会进行预订(返回200 OK),但当我使用Java 使用@Transactional时未从rest服务返回数据,java,spring,rest,spring-data-jpa,h2,Java,Spring,Rest,Spring Data Jpa,H2,我已经创建了一个示例酒店预订应用程序 我有两个服务,一个是预订服务,另一个是查看预订,我使用内存中的DB H2 当我尝试使用预订服务的预订URL预订房间时,会进行预订(返回200 OK),但当我使用@Transactional时,不会返回预订数据。如果我删除@Transactional(返回200 OK和预订数据),它可以正常工作 BookingServiceImpl package com.reservation.hotel.service.impl; import java.tex
@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;
}
}
您能解释一下这里发生了什么吗?您正在向自己的应用程序发送一个HTTP请求,以获取一些值并将其返回,但该值尚未保存到数据库中,因为事务尚未提交。我完全不知道你为什么要这样做,而不是直接查询数据库。我计划稍后将其分解为一个微服务应用程序,我尝试遵循命令查询责任分离(CQRS)模式。在事务完成之前,是否可以停止方法返回。如果我不想再次重复获取代码,那么还有什么替代方案呢?在这种情况下,我如何向用户指出预订结果?对此有任何想法都值得高度赞赏,您不应该重复获取代码。您应该从两个web服务调用相同的方法,因为您确实希望返回POST响应正文中的数据(通常不应该这样做:您应该返回所创建资源的ID/URL,客户端应该发送第二个GET请求以获取资源)。好的,我得到了您的答案,我想我将进一步挖掘如何在microservices环境中实现这一点,其中每个服务都应该有自己的数据库,谢谢:)
return restTemplate.getForObject(getReservationsByGuestIdURL + guestId, List.class);