java 我尝试从另一个服务调用一个车辆API,但从我的服务类调用该API时,它给出错误405方法不允许

gzjq41n4  于 2023-01-11  发布在  Java
关注(0)|答案(1)|浏览(139)

这是另一个代码(用于车辆维修),工作正常

public ResponseEntity updateByVehicleId(Vehicle vehicle, BigInteger id) {
    if (id == null || id.compareTo(BigInteger.ZERO) < 0) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid id");
    }

    if (vehicle == null) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid vehicle object");
    }

    Vehicle mod = repository.findById(id).orElseThrow(() -> new NoSuchElementException("Vehicle not found with id " + id));
    
    vehicle.setModifiedDate(new Date());
    repository.save(vehicle);
    
    return ResponseEntity.status(HttpStatus.OK).body("vehicle details modified successfully");
}

这是我用于车辆管理服务的代码

public Vehicle updateByVehicleId(Vehicle vehicle,BigInteger id) {
    RestTemplate restTemplate = new RestTemplate();
    HttpEntity<Vehicle> request = new HttpEntity<>(vehicle);
    
    ResponseEntity<Vehicle> response = restTemplate.exchange(RESTTEMPLATE_GET_BY_VEHICLE_ID, HttpMethod.PUT, request, Vehicle.class, id);

    return response.getBody();
}

从中调用车辆的控制器类。

public static final String GET_BY_VEHICLE_ID = "/vehicle/{id}";

@PutMapping(GET_BY_VEHICLE_ID)
public Vehicle updateByVehicleId(@PathVariable BigInteger id,@RequestBody Vehicle vehicle) {
    
    logger.info("Log level:updated vehicle details");
    
    return vmsService.updateByVehicleId(vehicle,id);
}

我得打个电话到车辆管理处去。
我尝试使用车辆ID更新所有车辆详细信息,有两种服务:一个是车辆,另一个是车辆管理服务
当我尝试更新车辆中的细节时,它工作正常。但是,同样的,当我尝试为此API创建REST模板时,它没有更新数据,而是给出错误:
{请求处理失败;嵌套异常是org.springframework.web.客户端。HttpClientErrorException$不允许的方法:405不允许的方法:[无正文]}。
这是我在 Postman x1c 0d1x中发送的请求
这是控制台

上的错误

agxfikkp

agxfikkp1#

由于您在Controller中使用此签名:

public static final String GET_BY_VEHICLE_ID = "/vehicle/{id}";

@PutMapping(GET_BY_VEHICLE_ID)
public Vehicle updateByVehicleId(@PathVariable BigInteger id,@RequestBody Vehicle vehicle) {
    ...
    
}

您需要确保发送给它的HttpRequest包含以下内容:

  • 方法必须为PUT
  • URL(路径)中的id-即/vms/vehicle/{id}
  • 请求的主体需要具有Vehicle示例。

例如:

{ 
  "oemId":4445, 
  "vin":"843", 
  "chassisNumber":"246", 
  "chassisSeries":"RSDXHCTJG54", 
  "registrationNumber":"348" 
}

然后,在您的方法中:

public Vehicle updateByVehicleId(Vehicle vehicle,BigInteger id) {
   ...
}

您再次调用restTemplate,但不需要调用RestTemplate来将项目存储在存储库中。
相反,您可以简单地调用

public Vehicle updateByVehicleId(Vehicle vehicle,BigInteger id) {
   repository.save(vehicle);
   return repository.findById(id);
}

相关问题