Spring 引导 REST API 不支持的媒体类型

Spring Boot REST API unsupported media type

我有两个 API:s,端口 8080 上的 CarRental-API 和端口 8081 上的 CarRental-CRUD。

CarRental-CRUD 使用 JpaRepository 访问 h2 内存 DB。

我想使用 CarRental-API 通过 webclient 向 CarRental-CRUD 发出请求。

在 CarRental-CRUD 中,我可以发出 post 请求并使用此服务向数据库添加汽车:

public String addCar(Car car) {
    
    carRepository.save(car);
    
    return loggerService.writeLoggerMsg("CREATED CAR AND ADDED TO DB");
}

然后在控制器中:

@RestController
@RequestMapping("/crud/v1")
public class AdminCarController {

    @Autowired
    private AdminCarService adminCarService;
    
    @PostMapping(path = "/addcar",  consumes = "application/json")
    public String addCar(@RequestBody Car car) {
        return adminCarService.addCar(car);
    }
}

我尝试 post 在 CarRental-API 中使用 webclient 的请求,其中:

@Service
public class AdminCarService {

    @Autowired 
    LoggerService loggerService;
    
    @Autowired
    private WebClient.Builder webClientBuilder;

    public String  addCar(Car car) {

            webClientBuilder
                    .build()
                    .post()
                    .uri("localhost:8081/crud/v1/addcar")
                    .retrieve()
                    .bodyToFlux(Car.class);

        return loggerService.writeLoggerMsg("ADDED CAR TO DB");
        }
}

但是,使用 carRental-API 时,当我尝试 post 请求时,我在 postman 中遇到此错误:

 "status": 500,
"error": "Internal Server Error",
"trace": "org.springframework.web.reactive.function.client.WebClientResponseException: 200 OK from POST localhost:8081/crud/v1/addcar; nested exception is org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'text/plain;charset=UTF-8' not supported for bodyType=com.backend.carrentalapi.entity.Car\n\tat 

这是汽车实体:

@Getter
@Setter
@RequiredArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "TBL_CAR")
public class Car {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long carId;

    @Column(name = "NAME")
    private String carName;

    @Column(name = "MODEL")
    private String carModel;

    @Column(name = "DAILY_PRICE")
    private double dailyPrice;


}

我似乎无法在生成的代码中找到 text/plain。我在 postman 中确保我正在 posting 原始 JSON body 请求,并且 headers 说内容类型:application/json .

在您的 WebClient 中,您没有添加请求正文,而是期望从您正在调用的 API 返回 Car(并且此 API returns 一个简单的 String 代替)。以下应该有效。

@Service
public class AdminCarService {

    @Autowired 
    LoggerService loggerService;
    
    @Autowired
    private WebClient.Builder webClientBuilder;

    public String  addCar(Car car) {

            webClientBuilder
                    .build()
                    .post()
                    .uri("localhost:8081/crud/v1/addcar")
                    .body(BodyInserters.fromValue(car))
                    .retrieve()
                    .toBodilessEntity();

        return loggerService.writeLoggerMsg("ADDED CAR TO DB");
        }
}

使用 .toBodilessEntity() 因为您实际上并没有对响应做任何事情。