Как поддерживать обратную сопоставимость для типа param в REST API - PullRequest
0 голосов
/ 11 сентября 2018

У меня 40-45 REST API, созданных с использованием Apache CXF. У меня есть параметр telehpneNumber, который имеет тип Long, теперь мне нужно изменить его на String, но я также хочу, чтобы они были обратно совместимы.

Текущие размышления над этим для создания двух остальных контроллеров, таких как v1 (старый) v2(new) v2 will be accepting String format. Using adaptor pattern I'll proxy v1 request to v2 . But telephoneNumber param is used in various objects & places. I though of making it as a type of Object`, но это работает, как и ожидалось, когда речь идет о получении запроса , но это не будет, когда я буду возвращать ответ.

Каким будет правильный подход для решения проблемы обратной совместимости?

В настоящее время мои мысли похожи на то, что написано ниже:

class OldTelephoneRequest{
    Long telephoneNumber;
    //some more variables
    //getters & setters

}

class TelephoneRequest{
    String telephoneNumber;
    //some more variables
    //getters & setters

}

@Path("/rest/services/v1")
class OldRestAPI{


    @Path("telephoneDetails")
    public Response telephoneDetails(OldTelephoneRequest oldTelephoneRequest){
        //make proxy call to v2 which will accept telephoneRequst object
        //Convert telephoneRequst to newTelephoneRequst(which will have telephoneNumber as String )
        TelephoneRequest request=new TelephoneRequest(oldTelephoneRequest);

        return RestAPI.telephoneDetails(telephoneRequest)
    }
}



@Path("/rest/services/v2")
class RestAPI{


    @Path("telephoneDetails")
    public Response telephoneDetails(TelephoneRequest telephoneRequest){
        //business logic
    }
}

Вышеупомянутый подход имеет проблему в том, что мне придется создавать 40-45 конструкторов для каждого запроса, которые в основном преобразуются из oldRequest в newRequst Дайте мне знать, что будет лучшим подходом для решения этой проблемы.

1 Ответ

0 голосов
/ 11 сентября 2018

Самым чистым решением было бы оставить дизайн как есть и позволить MapStruct сделать отображение для вас:

@Mapper
public interface TelephoneRequestMapper {

    TelephoneRequestMapper INSTANCE = Mappers.getMapper(TelephoneRequestMapper.class );

    @Mapping(source = "oldTelephoneRequest", target = "telephoneRequest")
    TelephoneRequest oldTelephoneRequestToTelephoneRequest(OldTelephoneRequest oldTelephoneRequest); 
}

Для получения дополнительной информации: http://mapstruct.org/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...