Java SPRINGBOOT中的POST请求时发生I/O错误

Java SPRINGBOOT中的POST请求时发生I/O错误,java,spring-boot,ssl,Java,Spring Boot,Ssl,我在谷歌上搜索了这个问题。但是这些都不能解决我的问题。我在调用rest控件时,代码中的SSL证书有问题 我的控制方法是: @CrossOrigin(origins = "http://localhost:4200") @RequestMapping(value = "/token", method = RequestMethod.POST, produces = "application/json") public @ResponseBody TokenModel GetToken(@Reque

我在谷歌上搜索了这个问题。但是这些都不能解决我的问题。我在调用rest控件时,代码中的SSL证书有问题

我的控制方法是:

@CrossOrigin(origins = "http://localhost:4200")
@RequestMapping(value = "/token", method = RequestMethod.POST, produces = "application/json")
public @ResponseBody TokenModel GetToken(@RequestBody RequestBodyJson requestBodyJson) {
    TokenModel response = null; 
    RestTemplate restTemplate = new RestTemplate();
    try {                          
        response = new GenericRestClient<RequestBodyJson, TokenModel>().execute(
            new RequestDetails(url, HttpMethod.POST), requestBodyJson, responseHandler,TokenModel.class);
        restTemplate.getForEntity(url , TokenModel.class);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
    return response;
}
@交叉原点(原点=”http://localhost:4200")
@RequestMapping(value=“/token”,method=RequestMethod.POST,products=“application/json”)
public@ResponseBody TokenModel GetToken(@RequestBody RequestBodyJson RequestBodyJson){
令牌模型响应=null;
RestTemplate RestTemplate=新RestTemplate();
试试{
响应=新建GenericRestClient()。执行(
新的RequestDetails(url、HttpMethod.POST)、requestBodyJson、responseHandler、TokenModel.class);
getForEntity(url,TokenModel.class);
}捕获(例外e){
System.out.println(e.getMessage());
}
返回响应;
}
错误为:-对“”进行POST请求时出现I/O错误:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径;嵌套异常为javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径


有人能帮我吗?

谢谢大家的帮助

我已经用计算机解决了这个问题

在POM.XML中,我添加了一个依赖项

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5</version>
</dependency>

org.apache.httpcomponents
httpclient
4.5
那么我的JAVA代码是

@RequestMapping(value = "/gettokens", method = RequestMethod.POST, produces = "application/json")
public @ResponseBody ResponseEntity<TokenModel> GetTokens(@RequestBody RequestBodyJson requestBodyJson)
        throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
    ResponseEntity<TokenModel> response = null;
    TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
    SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
            .loadTrustMaterial(null, acceptingTrustStrategy).build();
    SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
    CloseableHttpClient httpClient = HttpClients.custom()
            .setSSLSocketFactory(csf).build();
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
    requestFactory.setHttpClient(httpClient);
    RestTemplate restTemplate = new RestTemplate(requestFactory);       
    try {                          
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
        Map map = new HashMap<String, String>();
        map.put("Content-Type", "application/json");
        headers.setAll(map);
        HttpEntity<?> _HttpEntityRequestBodyJson = new HttpEntity<>(requestBodyJson, headers); 
        response= restTemplate.exchange(url, HttpMethod.POST,_HttpEntityRequestBodyJson, new ParameterizedTypeReference<TokenModel>() {});  
        System.out.println(response.getBody());
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
    return response;
}
@RequestMapping(value=“/gettokens”,method=RequestMethod.POST,products=“application/json”)
public@ResponseBody ResponseEntity GetTokens(@RequestBody RequestBodyJson RequestBodyJson)
抛出KeyManagementException、NoSuchAlgorithmException、KeyStoreException{
ResponseEntity response=null;
TrustStrategy acceptingTrustStrategy=(X509Certificate[]链,字符串authType)->true;
SSLContext SSLContext=org.apache.http.ssl.SSLContexts.custom()
.loadTrustMaterial(null,acceptingTrustStrategy).build();
SSLConnectionSocketFactory csf=新的SSLConnectionSocketFactory(sslContext);
CloseableHttpClient httpClient=HttpClients.custom()
.setsslssocketfactory(csf).build();
HttpComponents客户端HttpRequestFactory requestFactory=新的HttpComponents客户端HttpRequestFactory();
setHttpClient(httpClient);
RestTemplate RestTemplate=新的RestTemplate(requestFactory);
试试{
多值映射头=新的LinkedMultiValueMap();
Map Map=newhashmap();
map.put(“内容类型”、“应用程序/json”);
headers.setAll(map);
HttpEntity _HttpEntityRequestBodyJson=新的HttpEntity(requestBodyJson,标头);
response=restemplate.exchange(url,HttpMethod.POST,_HttpEntityRequestBodyJson,新的ParameterizeTypeReference(){});
System.out.println(response.getBody());
}捕获(例外e){
System.out.println(e.getMessage());
}
返回响应;
}

Rest通常应该在https上工作,但您使用的是http,这可能是问题所在,即“https://localhost:4200”localhost:4200是我的前端。所以我从UI调用我的微服务。从微软,我试图调用另一个api
HTTPS://WWW.myurl.com
,只有我自己才知道这个问题。HTTPS///myurl.com的SSL证书不受java信任的原因可能是CA证书没有导入到您的应用程序正在使用的CACERT中。有关详细信息,您可以参考以下问题:获取证书
https///myurl.com
正在使用并将其导入JVM的
cacerts
。@EugenCovaci能否提供一些参考?请小心,您正在覆盖证书的标准处理,即,您正在将应用程序配置为始终信任远程SSL证书而不进行验证。有关更多信息,请参阅以进行测试