私はSpring Bootを使ってサービスを開発しました。レスポンス全体を変更せずにHATEOASに基づいてURLを返す方法は?
@RestController
@RequestMapping("/cars")
public class CarController {
@Autowired
private CarService carService;
@Autowired
private CarMapper carMapper;
@GetMapping("/{id}")
public CarDto findById(@PathVariable Long id) {
Car car = carService.findById(id);
return carMapper.mapToCarDto(car);
}
}
CarMapper
mapstructを使用して定義される:これは、コード(簡体字)です。ここで(同様に簡略化)コードは次のとおりです。
@Mapper(componentModel="spring",
uses={ MakeModelMapper.class })
public interface CarMapper {
@Mappings({
//fields omitted
@Mapping(source="listaImagenCarro", target="rutasImagenes")
})
CarDto mapToCarDto(Car car);
String CAR_IMAGE_URL_FORMAT = "/cars/%d/images/%d"
/*
MapStruct will invoke this method to map my car image domain object into a String. Here's my issue.
*/
default String mapToUrl(CarImage carImage) {
if (carImage == null) return null;
return String.format(
CAR_IMAGE_URL_FORMAT,
carImage.getCar().getId(),
carImage.getId()
);
}
}
サービスを呼び出すときに私が得るJSONレスポンス:
{
"id": 9,
"make": { ... },
"model": { ... },
//more fields...
//the urls for the car images
"images": [
"/cars/9/images/1"
]
}
私はimages
フィールドには、私のアプリサーバーとパスに関する有効なURLを返すことを必要とします配備されています。私はポート8080を通じてローカルホストを使用してアプリケーションをデプロイする場合、例えば、私はこれを取得したいと思います:
{
"id": 9,
"make": { ... },
"model": { ... },
//more fields...
"imagenes": [
"http://localhost:8080/cars/9/images/1"
]
}
私は私が欲しいものを思われる、Building a Hypermedia-Driven RESTful Web Serviceを確認しました。私はこれらのURLのためだけにそれを必要とすることを除いて、私は全体の応答オブジェクトを変更したくありません。
これを達成する別の方法はありますか?