2013-08-30 2 views
0

내가하려고하는 것이 불가능하거나 어쩌면 금요일이 긴 주말 전에 금요일에 내 뇌가 알레시 체크 아웃했는지 확실하지 않습니다. 나는 몇 가지 접근법을 시도했지만 아무 것도 내가 무엇인지 알지 못한다. 내가 외부 REST API를 사용하여 내 포털 응용 프로그램 인터페이스하기 위해 아파치 HTTP 커먼즈 lib 디렉토리를 사용하는 작은 래퍼 프레임 워크를 작성하고콜 로직 로직이지만 추상적 인 리턴 타입

배경. 다음과 같은 계층 구조를 만들었습니다 (요청 및 응답 - 클라이언트는 실제 최종 클라이언트를 추상화하기 위해 여기서 사용하는 용어입니다).

ClientResponse (abstract) 
    BaseClientResponse (abstract) 
     ResponseA 
     ResponseB 
     ... 
     ResponseN 

를 지금까지 너무 좋아 - 내가 원하는 무엇

ClientRequest (abstract) 
    BaseClientRequest (abstract) 
     RequestA 
     RequestB 
     ... 
     RequestN 

마찬가지로 응답과 요청을 거울입니다. 접근하는 데 문제가 있습니다. ClientServiceUtil이라는 유틸리티 클래스를 만들고 메서드는 post()이라는 메서드를 구현하고 ClientRequest 매개 변수를 사용하고 마찬가지로 ClientResponse 형식을 반환합니다. 모든 서비스 호출은 동일한 논리를 사용했습니다. 필자가 만든 모델은 매개 변수에 일반 키 - 값 쌍을 사용하기 때문에 기술적으로는 기본 수준 클래스만으로도 벗어날 수 있지만 초기 단계이므로 논리가 서비스에 따라 달라지기 시작할 것입니다. 따라서 구체적인 구현.

내 게시 메서드에서 로직을 실행하고 결과를 저장하고 반환하는 ClientResponse 개체를 만드는 프로세스의 일부로 만듭니다. 이제 문제.

포틀릿이 있습니다. 포틀릿은 RequestA 오브젝트를 작성하고 ClientServiceUtil을 호출합니다. ResponseA 응답을 원하지만 그 결과는 ClientResponse이므로 할당 오류가 있습니다. 그때 캐스트와 함께이 문제를 해결하려고하면

ResponseA response = ClientServiceUtil.post(new RequestA()); 

는 ... 분명히, 나는 서비스 호출을 반복 생각하기 시작하고 지금 런타임 캐스트 예외

ResponseA response = (ResponseA)clientServiceUtil.post(new RequestA()); 

와 끝까지 논리 (내 게시물 메서드에서 발견) 각 요청에 대한 또는 부분 호출 등으로 나눌 내 유일한 옵션이 있습니다. 나는 그 일을 정말로하고 싶지 않기 때문에 다른 누군가가 나와 함께 할 수 있기를 바라고 있습니다.

+0

분명히 "ClientServiceUtil.post'는 'ClientResponse'를 반환하지만 ClientResponse 객체를 인스턴스화 할 수 없으므로 구체적인 유형. 만약 그것이'ResponseA' 타입이라면 타입 캐스트가 성공할 것입니다. 그렇지 않은 경우 그렇지 않습니다. 어쩌면 틀린 응답을 돌려주는'post' 메쏘드에 오류가있을 수 있습니까? 어쩌면 내가 뭔가를 놓치고있어 ... – ajb

+0

왜 ClientResponse를 인스턴스화 할 수 없다는 말입니까? 이것이 바로 모든 요청이 동일한 호출 로직을 사용하기 때문에 하나의 메소드가 모든 종류의 요청에 응답하도록하기 위해 ClientServiceUtil.post에서 지금하고있는 일입니다. – jardineworks

+0

추상적이라면'새로운 ClientResponse()'를 말할 수 없다. 당신은'ClientResponse' 타입의 변수를 선언 할 수 있습니다. 그러나 그것을 설정할 때 구체적인 타입으로 설정되어야합니다. 'ClientResponse r = 새로운 ResponseA();'. ('new ClientResponse()'를 말할 수있는 유일한 방법은 중괄호로 묶어 새로운 익명의 concrete 클래스를 만드는 것입니다.) 실제로 선언문에서'abstract'라는 단어를 사용했다고 가정합니다. 'ClientResponse'. – ajb

답변

0

당신은 제네릭을 사용할 수, 예컨대 :

public <T, R extends ClientResponse<T>> R post(ClientRequest<T> request) { 
    ... 
} 
+0

나는 generics ealier로 soemthing을 시도했지만 그 주제에 대한 나의 경험 부족이 나를 똑같은 길로 인도 할 수도 있다고 생각한다. 더 많이 생각하면할수록 더 많은 genics가 의미가있는 것처럼 보입니다. 정말로 일반적인 서비스가 무엇인지 ... 그리고 나는 단지 특정 유형의 서비스를 만들고 있습니다. 궁금해서, 서비스 과 같은 서비스를 수행 할 수 있을까요? 서비스 <인증>과 같은 서비스 유형을 전달할 수 있습니까? – jardineworks

+1

약간의 변경 사항이있는 몇 가지 사항을 여기에 사용하고 있습니다. 유틸리티 클래스를 모두 덤프하여 게시물을 이동합니다. 로직을 요청 클래스에 추가하면됩니다. 이렇게하면 게시물 코드를 복제 할 필요없이 T를 사용하여 올바른 응답 (응답 r = 새 응답 ();)을 생성 할 수 있습니다. 고맙습니다! – jardineworks

+0

그게 더 좋은 해결책입니다, @jardineworks! –

0

것은 내가 관련된 응답을 만들 수있는 공장의 종류로 요청을 사용하는 것이 좋습니다. 예 :

public interface ClientRequest { 
    ... 
    public ClientResponse createResponseInstance(); 
    ... 
} 

그런 다음, 그래서

public ClientResponse post(ClientRequest req) { 
    ...send the request... 
    ClientResponse resp = req.createResponseInstance(); 
    ...initialize values in resp... 
    return resp; 
} 

, ClientServiceUtil에서 다음과 같은 경우 :

public class RequestA extends BaseClientRequest { 
    ... 
    public ClientResponse createResponseInstance() { 
     return new ResponseA(); 
    } 
    ... 
} 

다음 post()ResponseA 객체를 반환하는 RequestA가 매개 변수로 전달 될 때 .

이렇게하면 응답을 ResponseA에 안전하게 전송할 수 있습니다.