【问题标题】:RestTemplateBuilder is failed when building构建时 RestTemplateBuilder 失败
【发布时间】:2018-06-07 18:52:39
【问题描述】:

我使用 Rest Template 创建了 Rest Web 服务调用,对于基本身份验证,我尝试在发送请求时使用 RestTemplateBuilder 构建基本身份验证。我已经给出了所有 Spring Boot 依赖项:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

代码:

final RestTemplate restTemplate = restTemplateBuilder
      .basicAuthorization("username", "password").build();
restTemplate.postForObject("rest webservice url",inputparam, XXX.Class);

但即使在给予依赖之后,构建也会失败。 谁能帮我解决这个问题?

【问题讨论】:

  • "build is failed" 那么,你能分享一下错误信息吗?
  • 1.ERROR in ERROR in C:\Hybris\..\..\......\...\XXXXXXXXX.java (at line 16) import org.springframework.boot .web.client.RestTemplateBuilder; import org.springframework.boot 无法解析 2. ERROR in C:\Hybris\..\..\......\...\XXXXXXXXX.java (at line 39) private static RestTemplateBuilder restTemplateBuilder; RestTemplateBuilder 无法解析为类型 3. C:\Hybris\..\..\......\...\XXXXXXXXX.java 中的错误(第 52 行) final RestTemplate restTemplate = restTemplateBuilder RestTemplateBuilder 无法解析到一个类型

标签: java spring spring-boot hybris


【解决方案1】:

我不确定为什么依赖项没有解决,但我可以告诉你我是如何解决相关问题的。

首先,我为我所有的其余模板功能提供服务:

@Service
@SuppressWarnings("squid:RedundantThrowsDeclarationCheck")
public class RestTemplateService {

private RestTemplate restTemplate;

public RestTemplateService() {
    this.restTemplate = new RestTemplate();
}

public <T> T doGETRequestForObject(String url, Class<T> responseType) throws RestClientException {
    return restTemplate.getForObject(url, responseType);
}

public <T> T doGETRequestForObject(String url, Class<T> responseType, Map<String, String> queryParams) throws RestClientException {
    return restTemplate.getForObject(url, responseType, queryParams);
}

public <T> T doGETRequestForObject(String url, Class<T> responseType, Map<String, String> queryParams, Map<String, String> headerParams, MediaType... mediaTypes) throws RequestIsNotOKException {
    return doGETRequestForEntity(url, responseType, queryParams, headerParams, mediaTypes).getBody();
}

public <T> ResponseEntity<T> doGETRequestForEntity(String url, Class<T> responseType) throws RestClientException, RequestIsNotOKException {
    ResponseEntity<T> entity = restTemplate.getForEntity(url, responseType);
    validateResponseStatus(entity);
    return entity;
}

public <T> ResponseEntity<T> doGETRequestForEntity(String url, Class<T> responseType, Map<String, String> queryParams) throws RestClientException, RequestIsNotOKException {
    ResponseEntity<T> entity = restTemplate.getForEntity(url, responseType, queryParams);
    validateResponseStatus(entity);
    return entity;
}

public <T> ResponseEntity<T> doGETRequestForEntity(String url, Class<T> responseType, Map<String, String> queryParams, Map<String, String> headerParams, MediaType... mediaTypes) throws RestClientException, RequestIsNotOKException {
    ResponseEntity<T> entity = restTemplate.exchange(url, HttpMethod.GET, getHttpEntity(headerParams, mediaTypes, null), responseType, queryParams);
    validateResponseStatus(entity);
    return entity;
}

public HttpStatus doPOSTRequestForStatusCode(String url, Object requestBody) throws RestClientException {
    return restTemplate.postForEntity(url, requestBody, Void.class).getStatusCode();
}

public HttpStatus doPOSTRequestForStatusCode(String url, Object requestBody, Map<String, String> queryParams) throws RestClientException {
    return restTemplate.postForEntity(url, requestBody, Void.class, queryParams).getStatusCode();
}

public <T> T doPOSTRequestForObject(String url, Object requestBody, Class<T> responseType) throws RestClientException, RequestIsNotOKException {
    return restTemplate.postForObject(url, requestBody, responseType);
}

public <T> T doPOSTRequestForObject(String url, Object requestBody, Class<T> responseType, Map<String, String> queryParams) throws RestClientException {
    return restTemplate.postForObject(url, requestBody, responseType, queryParams);
}

public <T> T doPOSTRequestForObject(String url, Object requestBody, Class<T> responseType, Map<String, String> queryParams, Map<String, String> headerParams, MediaType... mediaTypes) throws RestClientException, RequestIsNotOKException {
    return doPOSTRequestForEntity(url, requestBody, responseType, queryParams, headerParams, mediaTypes).getBody();
}

public <T> ResponseEntity<T> doPOSTRequestForEntity(String url, Object requestBody, Class<T> responseType) throws RestClientException, RequestIsNotOKException {
    ResponseEntity<T> entity = restTemplate.postForEntity(url, requestBody, responseType);
    validateResponseStatus(entity);
    return entity;
}

public <T> ResponseEntity<T> doPOSTRequestForEntity(String url, Object requestBody, Class<T> responseType, Map<String, String> queryParams) throws RestClientException, RequestIsNotOKException {
    ResponseEntity<T> entity = restTemplate.postForEntity(url, requestBody, responseType, queryParams);
    validateResponseStatus(entity);
    return entity;
}

public <T> ResponseEntity<T> doPOSTRequestForEntity(String url, Object requestBody, Class<T> responseType, Map<String, String> queryParams, Map<String, String> headerParams, MediaType... mediaTypes) throws RestClientException, RequestIsNotOKException {
    ResponseEntity<T> entity = restTemplate.exchange(url, HttpMethod.POST, getHttpEntity(headerParams, mediaTypes, requestBody), responseType, queryParams);
    validateResponseStatus(entity);
    return entity;
}

private HttpEntity getHttpEntity(Map<String, String> headerParams, MediaType[] mediaTypes, Object requestBody) {
    return aHttpEntity()
             .withHeaderParams(headerParams)
             .withMediaTypes(mediaTypes)
             .withBody(requestBody)
             .build();
}

public <T> void validateResponseStatus(ResponseEntity<T> entity) throws RequestIsNotOKException {
    if (HttpStatus.OK.equals(entity.getStatusCode())) {
        throw new RequestIsNotOKException(entity);
    }
}

public RestTemplate getRestTemplate() {
    return restTemplate;
}

public static class RequestIsNotOKException extends Exception {

    private final ResponseEntity entity;

    public RequestIsNotOKException(ResponseEntity entity) {
        this.entity = entity;
    }

    public ResponseEntity getEntity() {
        return entity;
    }
}

}

如果我想通过基本身份验证,我有来自 util 类的静态方法用于编码

public static String encodeToBase64(String separator, String... parameters) {
    validateNonNulls(parameters);

    if (isBlank(separator)) {
        separator = StringUtils.EMPTY;
    }

    return encodeToBase64(join(parameters, separator));
}

public static String encodeToBase64(String strToEncode) {
    byte[] encodedStr = Base64.encodeBase64(strToEncode.getBytes());
    return new String(encodedStr);
}

现在您可以将编码的 usr/pass 传递给服务方法,该方法将为您构建 HttpHeader 和实体——顺便说一句,我使用小型构建器来处理各种参数映射...

... paramsMap = anParametersMap().withEntry("Authorization", encodeToBase64(":", usr, pass)).build()

restTemplateService.doPOSTRequestForObject("rest webservice url",requestBody, XXX.Class, null, paramsMap, null);

顺便说一句,您可以通过将 BasicAuthorizationInterceptor 添加到 restTemplate 拦截器来完成所有这些,但我没有这样做。

【讨论】:

    【解决方案2】:

    默认情况下,Hybris 不会下载传递依赖项,因此不会下载所有必需的库(依赖项的依赖项)。您必须全部指定它们或启用下载传递依赖项。在此处阅读操作方法:hybris's maven doesn't download transitive dependencies

    【讨论】:

      【解决方案3】:

      您可以使用RestTemplateBuilder 创建RestTemplate,如下所示。

      @Service
      public class ApiClient {
      
          private RestTemplate restTemplate;
      
          public ApiClient(RestTemplateBuilder builder) {
              restTemplate = builder.basicAuthorization("username", "password").build();
          }
      
          //Other implementation details
      }
      

      然后可以使用这个RestTemplate 实例调用远程api。

      【讨论】:

        猜你喜欢
        • 2017-06-18
        • 1970-01-01
        • 1970-01-01
        • 2018-03-11
        • 2014-02-23
        • 1970-01-01
        • 2010-11-26
        • 2021-08-05
        • 2021-11-11
        相关资源
        最近更新 更多