Java 使用@Transactional时未从rest服务返回数据

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

我已经创建了一个示例酒店预订应用程序 我有两个服务,一个是预订服务,另一个是查看预订,我使用内存中的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;
    }



}

您能解释一下这里发生了什么吗?

您正在向自己的应用程序发送一个HTTP请求,以获取一些值并将其返回,但该值尚未保存到数据库中,因为事务尚未提交。我完全不知道你为什么要这样做,而不是直接查询数据库。我计划稍后将其分解为一个微服务应用程序,我尝试遵循命令查询责任分离(CQRS)模式。在事务完成之前,是否可以停止方法返回。如果我不想再次重复获取代码,那么还有什么替代方案呢?在这种情况下,我如何向用户指出预订结果?对此有任何想法都值得高度赞赏,您不应该重复获取代码。您应该从两个web服务调用相同的方法,因为您确实希望返回POST响应正文中的数据(通常不应该这样做:您应该返回所创建资源的ID/URL,客户端应该发送第二个GET请求以获取资源)。好的,我得到了您的答案,我想我将进一步挖掘如何在microservices环境中实现这一点,其中每个服务都应该有自己的数据库,谢谢:)
return restTemplate.getForObject(getReservationsByGuestIdURL + guestId, List.class);