2016-06-24 3 views
0

개요 : 외부 REST 웹 서비스에서 가져 오기 요청을 호출하려면 RestTemplate을 사용하려고합니다. 다음과 같이Spring RestTemplate 교환 throw UnhandledHttpStatusException

내 코드는 다음과 같습니다

그러나 나는 코드에 "restTemplate.exchange(dispatchURL, HttpMethod.GET, entity, String.class, parameters);"를 호출 한 후 UnhandledHttpStatusException있어

@Slf4j 
@Component("AccMemberDetailsApiControllerImpl") 
public class AccMemberDetailsApiControllerImpl implements MemberDetailsApiController { 

    private static final String CONTENT_TYPE_HEADER_NAME = "Content-Type"; 
    private static final String AUTHORIZATION_HEADER_NAME = "Authorization"; 
    private static final String USERID_PARAMETER_NAME = "userId"; 
    private static final String VEHICLEID_PARAMETER_NAME = "vehicleId"; 

    private static final ObjectMapper mapper = new ObjectMapper(); 

    /** 
    * This constant is used to check whether or not the response from ACC is an empty JSON string 
    */ 
    private static final String EMPTY_RESPONSE = "{}"; 

    @Value("${com.blss.memberServices.provider.posServiceURL}") 
    private String accPosServiceURL; 

    @Autowired 
    private RestTemplate restTemplate; 

    @Autowired 
    private AccTokenUtility accTokenUtility; 

    @Autowired 
    private ResourceMessage resourceMessage; 

    void setAccTokenUtility(AccTokenUtility accTokenUtility) { 
     this.accTokenUtility = accTokenUtility; 
    } 

    void setResourceMessage(ResourceMessage resourceMessage) { 
     this.resourceMessage = resourceMessage; 
    } 

    /** 
    * @see MemberDetailsApiController#getMemberDetails(String, String) 
    */ 
    @Override 
    public MemberDetailsModel getMemberDetails(String storeId, String membershipIdentifier) { 

     /** 
     * Getting CAD token 
     */ 
     String token = accTokenUtility.getCadToken(); 

     /** 
     * Preparing the request 
     */ 
     HttpHeaders headers = new HttpHeaders(); 

//  headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); 
     headers.set(CONTENT_TYPE_HEADER_NAME, MediaType.APPLICATION_JSON_VALUE); 
     headers.set(AUTHORIZATION_HEADER_NAME, token); 
     HttpEntity<String> entity = new HttpEntity<>(headers); 

     /** 
     * Creating the dispatch URL by means of userId and vehicleId 
     */ 
     String dispatchURL = accPosServiceURL + "DispatchedEvent/{userId}/{vehicleId}"; 

     /** 
     * Creating the URL variables and being valued by corresponding method parameters 
     */ 
     Map<String, String> parameters = new HashMap<>(); 
//  parameters.put(USERID_PARAMETER_NAME, storeId); 
     parameters.put(USERID_PARAMETER_NAME, "mr2"); 
//  parameters.put(VEHICLEID_PARAMETER_NAME, membershipIdentifier); 
     parameters.put(VEHICLEID_PARAMETER_NAME, "VEH1"); 

     /** 
     * Calling the rest webservice and returning response with body of type {@link AccMemberDetails} 
     */ 
     ResponseEntity<String> response; 
     MemberDetailsModel memberDetailsModel = null; 
     AccMemberDetails accMemberDetails; 
     try { 
      response = restTemplate.exchange(dispatchURL, HttpMethod.GET, entity, String.class, parameters); 
      if (response == null || StringUtils.isBlank(response.getBody()) || EMPTY_RESPONSE.equals(response.getBody())) { 
       throw new ResourceNotFoundException(resourceMessage.getMessage(MEMBER_ERROR_NOT_FOUND, storeId, membershipIdentifier)); 
      } else { 
       accMemberDetails = deserialize(response.getBody(), AccMemberDetails.class); 
       String accErrorMessage = accMemberDetails.getUserMessage(); 
       if (!StringUtils.isBlank(accErrorMessage)) { 
        throw new InternalServerException(resourceMessage.getMessage(MEMBER_ERROR_MESSAGE_FROM_API, "ACC", accErrorMessage)); 
       } 
       memberDetailsModel = convert(accMemberDetails); 
      } 
     } catch (RestClientException e) { 
      handleExceptions(e, storeId, membershipIdentifier); 
     } 
     return memberDetailsModel; 
    } 

    /** 
    * This method is responsible for deserializing string REST response into an object of type {@link AccMemberDetails} 
    */ 
    <T> T deserialize(final String response, final Class<T> responseClass) { 
     try { 
      return mapper.readValue(response, responseClass); 
     } catch (IOException e) { 
      throw new InternalServerException(resourceMessage.getMessage(MEMBER_ERROR_MAP_RESPONSE_OBJECT), e); 
     } 
    } 

    /** 
    * This method is responsible for converting an instance of type {@link AccMemberDetails} to an instance of type 
    * {@link MemberDetailsModel} 
    * 
    * @param accMemberDetails an instance of type {@link AccMemberDetails} 
    * @return an instance of type {@link MemberDetailsModel} 
    */ 
    MemberDetailsModel convert(AccMemberDetails accMemberDetails) { 
     MemberDetailsModel memberDetailsModel = new MemberDetailsModel(); 
     memberDetailsModel.setEventId(accMemberDetails.getEventId()); 
     memberDetailsModel.setMemberName(accMemberDetails.getMemberName()); 
     memberDetailsModel.setMembershipNumber(accMemberDetails.getMembershipNumber()); 
     memberDetailsModel.setMembershipLevel(accMemberDetails.getPricingLevel()); 
     return memberDetailsModel; 
    } 

    /** 
    * This method is responsible for handling Exceptions may be thrown by ACC REST webservice 
    * 
    * @param e     an instance of type {@link RestClientException} 
    * @param storeId    an instance of type {@link String} and used in building exception messages 
    * @param membershipIdentifier an instance of type {@link String} and used in building exception messages 
    */ 
    private void handleExceptions(RestClientException e, String storeId, String membershipIdentifier) { 
     if (e instanceof HttpStatusCodeException) { 
      HttpStatusCodeException httpStatusCodeException = (HttpStatusCodeException) e; 
      HttpStatus httpStatusCode = httpStatusCodeException.getStatusCode(); 
      if (404 == httpStatusCode.value()) { 
       throw new ResourceNotFoundException(resourceMessage.getMessage(MEMBER_ERROR_NOT_FOUND, storeId, membershipIdentifier), e); 
      } else if (500 == httpStatusCode.value()) { 
       throw new InternalServerException(resourceMessage.getMessage(MEMBER_SERVER_ERROR, "ACC"), e); 
      } else { 
       throw new InternalServerException(resourceMessage.getMessage(MEMBER_HTTP_STATUS_CODE_ERROR, "HttpStatusCodeException", "ACC"), e); 
      } 
     } else { 
      throw new InternalServerException(resourceMessage.getMessage(MEMBER_REST_CLIENT_ERROR, "RestClientException", "ACC"), e); 
     } 
    } 

문제. 누군가가 나에게 해결책을 제시 할 수 있다면

Caused by: org.springframework.web.client.UnknownHttpStatusCodeException: Unknown status code [443] null at org.springframework.web.client.DefaultResponseErrorHandler.getHttpStatusCode(DefaultResponseErrorHandler.java:60) at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:50) at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:629) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:565) at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:484) at com.blss.retailServices.memberServices.controllers.impl.acc.AccMemberDetailsApiControllerImpl.getMemberDetails(AccMemberDetailsApiControllerImpl.java:110) 

가 지금은 감사 할 것입니다 : 다음과 같이 예외 스택 추적입니다.

+1

요청 및 응답을 검토하여 실제로 전송 된 내용을 확인 했습니까? 443은 정의 된 HTTP 상태 코드가 아니며 HTTPS 포트 번호 (443)가 포함 된 메시지가 혼동을 일으킨 것처럼 보입니다. HTTPS 서비스에 연결을 시도하고 있습니까? 해당 서비스의 인증서가 유효합니까? –

+0

curl 명령을 사용하여 나머지 webservice를 검사하고 동일한 예외가 발생했습니다. 자세한 정보는 curl 명령에서 "-v"를 사용하여 동일한 http unknown code (443)를 얻었습니다. 따라서, 예외 처리기를 리팩터링하여 이러한 경우에 "404"와 같은 의미있는 예외 코드를 반환해야하는 것처럼 들립니다. – saeedj

답변

1

응답으로 더 많은 정보를 얻기 위해 "-v"를 사용하여 말괄 처리로이 웹 서비스를 호출했습니다. 결과적으로, 나는 그들의 편에서 같은 예외 (443)를 얻었다. 그래서 그들은 의미있는 예외 메시지를 반환하는 더 나은 예외 처리기가 있어야하는 것 같습니다.

관련 문제