当前位置: 首页 > 知识库问答 >
问题:

使用openweather API的restful webservice的问题?

阎承
2023-03-14

我试图从openweathermap api中检索天气细节,一些我无法使其工作的原因如下错误。如有任何帮助,我将不胜感激

@Controller
public class CurrentWeatherController {
 
    private final StubWeatherService stubWeatherService;
    private final LiveWeatherService liveWeatherService;
 
    public CurrentWeatherController(StubWeatherService stubWeatherService, LiveWeatherService liveWeatherService) {
        this.stubWeatherService = stubWeatherService;
        this.liveWeatherService = liveWeatherService;
    }
 
    @GetMapping("/current-weather")
    public String getCurrentWeather(Model model) {
        model.addAttribute("currentWeather", liveWeatherService.getCurrentWeather("Detroit","us"));
        return "current-weather";
    }

    public StubWeatherService getStubWeatherService() {
        return stubWeatherService;
    }

服务代码

@Service
public class LiveWeatherService {

    private static final String WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather?q={city},{country}&APPID={key}&units=metric";

    private final String apiKey="526a647fcd4f3f465c0340c19d26ef3a";

    private final RestTemplate restTemplate;
    private final ObjectMapper objectMapper;

    public LiveWeatherService(RestTemplateBuilder restTemplateBuilder, ObjectMapper objectMapper) {
        this.restTemplate = restTemplateBuilder.build();
        this.objectMapper = objectMapper;
    }

    public CurrentWeather getCurrentWeather(String city, String country) {
        URI url = new UriTemplate(WEATHER_URL).expand(city, country,this.apiKey);    // line 34 issue with accepting apikey 
        ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

        return convert(response);
    }

    private CurrentWeather convert(ResponseEntity<String> response) {
        try {
            JsonNode root = objectMapper.readTree(response.getBody());
            return new CurrentWeather(root.path("weather").get(0).path("main").asText(),
                    BigDecimal.valueOf(root.path("main").path("temp").asDouble()),
                    BigDecimal.valueOf(root.path("main").path("feels_like").asDouble()),
                    BigDecimal.valueOf(root.path("wind").path("speed").asDouble()));
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Error parsing JSON", e);
        }
    }
}

错误

2-07 02:34:48.710错误43384---[nio-8080-exec-3]O.A.C.C.C.[.[.[/].[dispatcherServlet]:路径为[]的上下文中servlet[dispatcherServlet]的servlet.service()引发异常[处理程序调度失败;嵌套异常为java.lang.ERROR:未解决的编译问题:类型不匹配:无法从UriTemplate转换为URI]有根本原因

java.lang.Error: Unresolved compilation problem: 
  Type mismatch: cannot convert from UriTemplate to URI

  at com.meshupProjekt.service.LiveWeatherService.getCurrentWeather(LiveWeatherService.java:34)

共有1个答案

谷梁迪
2023-03-14

对我来说,您的代码是这样工作的:

    String WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather?q={city},{country}&APPID={key}&units=metric";
    String apiKey = "526a647fcd4f3f465c0340c19d26ef3a";
    var x = new UriTemplate(WEATHER_URL).expand("Darmstadt", "Deutschland", apiKey);
    System.out.println(x);

而不是URI,我使用了var,以便Java选择正确的类型。
您的编译错误可能是由URI类的错误导入引起的。

 类似资料:
  • 问题内容: 我有以下课程: 我的所有实体类都使用该类。 所以我有以下课程 和 因此,当我创建一个新客户时,出现以下错误: 我在这里做错了。 问题答案: 至少在使用JPA 的API 时,and 回调确实在…中工作,这在您的情况下还不清楚。 您在使用还是API?在后一种情况下,使用注解的方法,从JPA注释将不会被调用(和我的建议是使用监听器或拦截器)。

  • 问题内容: 我一直在使用Spring JDBC取得了巨大的成功,但是我在这个项目中遇到了很多麻烦。我将在此处发布代码链接(这是一个小而愚蠢的项目,用于测试是否可以启动并运行它,以便将来可以使用Hibernate): xml文件:http://codepaste.net/uw19zc 主文件:http : //codepaste.net/iks1cp 我遇到很多错误,例如 而且我还没有创建一个.ou

  • 我正在尝试将VaultCustomQueryCriteria(Corda-Java)与聚合函数SUM一起使用,但没有得到任何结果。 如果我使用另一个VaultCustomQueryCriteria,则查询有效。 我做错了什么? 下面是一些例子: 查询成功: 查询KO:(没有结果)

  • 我已经复制了特性和插件,并分别粘贴在eclipse特性和插件文件夹中。现在,如果我创建TestNG类, 我得到以下错误“选定的向导无法启动。插件org.testng.eclipse.wizards.newtestngClassWizard.org.testng.eclipse.wizards.newtestngClassWizard无法加载类org.testng.eclipse.wizards.n

  • 本文向大家介绍jQuery中 delegate使用的问题,包括了jQuery中 delegate使用的问题的使用技巧和注意事项,需要的朋友参考一下 习惯了bind,用惯了live,就不习惯delegate了呀有木有... 支持为动态生成的标签元素绑定事件也许就live和delegate了吧,不过新版本已经不支持live了,只有delegate delegate真的比较特殊呀,不同于其他事件绑定的风

  • 问题内容: 我正在编写一段代码,以使用对称加密来加密文本。但这并没有带来正确的结果… 在这里,解密后的文本与原始文本不同。 我对密码学不是很了解,所以请多多包涵。我知道CTR模式每次都需要一个“计数器”功能来提供一个随机计数器,但是为什么当我的密钥是32字节并且它也坚持我的消息也是16字节的倍数时,为什么它需要是16字节?这正常吗? 我猜想它不会回到原始消息,因为计数器在加密和解密之间发生了变化。