Java 无法使用resttemplate使用rest api

Java 无法使用resttemplate使用rest api,java,spring,resttemplate,Java,Spring,Resttemplate,我有这个api,我正在尝试使用,这是链接https://www.live-rates.com/api/price?key=123456&rate=EUR_USD 我已经在我的控制器上试过了 @ResponseBody @RequestMapping(value = { "/start" }, method = RequestMethod.GET) public String start() { RestTemplate restTemplate = new RestTempla

我有这个api,我正在尝试使用,这是链接
https://www.live-rates.com/api/price?key=123456&rate=EUR_USD

我已经在我的控制器上试过了

@ResponseBody
    @RequestMapping(value = { "/start" }, method = RequestMethod.GET)
    public String start() { 
RestTemplate restTemplate = new RestTemplate();

        String quote = restTemplate.getForObject("https://www.live-rates.com/api/price?key=123456&rate=EUR_USD", String.class);
        return quote.toString();
    }
这在我的日程安排中

package com.boilerplate.components;


import java.util.Date;
import org.slf4j.Logger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Async;

import com.boilerplate.services.MessageListenerService;
import java.util.Random;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

@Repository
@Transactional
@Configuration
@EnableAsync
@EnableScheduling
public class Scheduler {
//Database read and update and delete
    @Autowired
    private RabbitTemplate rabbitTemplate;

    private static final Logger LOGGER = org.slf4j.LoggerFactory.getLogger(MessageListenerService.class);

    @Autowired 
    private SessionFactory sessionFactory;

    @Async
    @Scheduled(cron="*/60 * * * * *")
    public void doSomething(){

        RestTemplate restTemplate = new RestTemplate();

        String quote = restTemplate.getForObject("https://www.live-rates.com/api/price?key=123456&rate=EUR_USD", String.class);
        LOGGER.info(quote.toString());

  }


    }
他们都没有得到汇率

我在使用调度程序时遇到此错误

严重:调用异步方法“public void”时发生意外错误 com.boilerplate.components.Scheduler.doSomething()。 org.springframework.web.client.httpclienterror异常:403禁止 位于org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) 位于org.springframework.web.client.restemplate.handleResponse(restemplate.java:641) 位于org.springframework.web.client.restemplate.doExecute(restemplate.java:597) 位于org.springframework.web.client.restemplate.execute(restemplate.java:557) 位于org.springframework.web.client.restemplate.getForObject(restemplate.java:264) 位于com.boilerplate.components.Scheduler.doSomething(Scheduler.java:53) 在com.boilerplate.components.Scheduler$$FastClassBySpringCGLIB$$17802b05.invoke()上 位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157)上 位于org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:281) 位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上 位于org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:115) 在java.util.concurrent.FutureTask.run(FutureTask.java:266)处 运行(Thread.java:748)

这是在使用控制器时发生的

@ResponseBody
    @RequestMapping(value = { "/start" }, method = RequestMethod.GET)
    public String start() { 
RestTemplate restTemplate = new RestTemplate();

        String quote = restTemplate.getForObject("https://www.live-rates.com/api/price?key=123456&rate=EUR_USD", String.class);
        return quote.toString();
    }
HTTP错误500

访问/样板文件/启动时出现问题。原因:

Server Error
原因:

org.springframework.web.util.NestedServletException:请求 处理失败;嵌套异常是 org.springframework.web.client.httpclienterror异常:403禁止 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:687) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:790) org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:800) 在 ServletHandler$CachedChain.doFilter(ServletHandler.java:1669)

我尝试过使用其他json API,如
https://jsonplaceholder.typicode.com/posts/1
我可以毫无问题地获取json


为什么我不能使用rest模板获取汇率。

您不需要在
@Scheduled
注释中使用
@Async
。调度程序无论如何都将在自己的线程上运行。当然,一个或多个正在运行的调度程序将按顺序运行,但这是可以更改的。但是对于您的情况,关于文档,似乎您可能必须通过依赖项注入来提供restTemplate。因此,
@Autowire
可以实现这一目的

请注意,要调度的方法必须具有void返回和 不能期望有任何争论。如果该方法需要与 应用程序上下文中的其他对象,通常是 已通过依赖项注入提供

因此,删除
@Async
并添加
restemplate
的依赖注入就可以做到这一点


如果您需要知道如何在不同的线程中运行多个调度程序,您可以检查此项。

是否尝试添加以下代码。您正在尝试使用HTTPS调用

CloseableHttpClient httpClient=HttpClients.custom().setSSLHostnameVerifier(新的NoopHostnameVerifier())
.build();
HttpComponents客户端HttpRequestFactory requestFactory=新的HttpComponents客户端HttpRequestFactory();
setHttpClient(httpClient);
RestTemplate RestTemplate=新的RestTemplate(requestFactory);
字符串quote=restTemplate.getForObject(“https://www.live-rates.com/api/price?key=123456&rate=EUR_USD",

字符串(类)

与原始问题无关,但如果变量'quote'已经是'String'类型,为什么需要在其上调用方法'toString()'?

自动连接restTemplate使程序在某个点冻结,应用程序现在无法完成启动。冻结时没有任何错误?您确实删除了异步注释吗?另外,请尝试删除您未使用的其他自动连接依赖项。应该是
Response-Response=restTemplate.getForObject()…
,这对我很有效。我必须将apache httpclient库添加到依赖项中-