2017-08-20 9 views
1

私は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のためだけにそれを必要とすることを除いて、私は全体の応答オブジェクトを変更したくありません。

これを達成する別の方法はありますか?

答えて

2

春HATEOASは、この目的のためだけにLinkBuilderサービスを提供します。

import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; 
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; 
//...// 

linkTo(methodOn(CarController.class).findById(9)).withRel("AddYourRelHere"); 

この出力する必要があり、あなたのリソースを指す絶対URL:

は、次の試してみてください。あなたが一部を変更または削除する必要がありますので、あなたが「withRelは(」「)」

HAL規則を次のようしていないあなたは、あなたが変更したい特定のDTOにこれを追加することができます。

CarDto dto = carMapper.mapToCarDto(car); 
if(dto.matches(criteria)){ 
    dto.setUrl(linkTo...); 
} 
return dto; 

ところでこれらのすべては、あなたが言及したチュートリアルの「RestControllerを作成する」セクションに示されています。

関連する問題