首页 > 解决方案 > 使用 @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);

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

标签: javaspringrestspring-data-jpah2

解决方案


推荐阅读