java - 从 openweather Api 消费 RESTful Web 服务的问题?
问题描述
我试图从 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] oaccC[.[.[/].[dispatcherServlet] : Servlet.service() 用于 servlet [dispatcherServlet] 在上下文中的路径 [ ] 抛出异常 [处理程序调度失败;嵌套异常是 java.lang.Error: Unresolved compiler problem: Type mismatch: cannot convert from UriTemplate to URI] with root cause
java.lang.Error: Unresolved compilation problem: Type mismatch: cannot convert from UriTemplate to URI at com.meshupProjekt.service.LiveWeatherService.getCurrentWeather(LiveWeatherService.java:34)
~[classes/:na] at com.meshupProjekt.controller.CurrentWeatherController.getCurrentWeather(CurrentWeatherController.java:36) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~ [na:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java :43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke (InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web- 5.3.2.jar:5.3.2] 在 org.springframework.web.servlet.mvc.method。annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java :894) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc- 5.3.2.jar:5.3.2] 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] 在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java :961)〜[spring-webmvc-5.3.2.jar:5.3.2]在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)〜[spring-webmvc-5.3.2.jar:5.3 .2] 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 javax.servlet.http.HttpServlet.service(HttpServlet .java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3. 2.jar:5.3.2] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] 在 org.apache.catalina。 core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0 .41.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] 在 org.apache .catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter. java:67) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41 .jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-
解决方案
对我来说,你的代码是这样工作的:
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
类导入引起的。
推荐阅读
- c# - 如何使用 appsettings 更改 api .net Core 中的语言资源?
- python-3.x - Tensorflow-Serving :requests.exceptions.HTTPError: 400 Client
- python - 在 seaborn 上的图像上绘制热图
- flutter - Flutter 应用中的 PlatformException(ad_not_loaded,奖励视频显示失败,未加载广告,null)
- elasticsearch - Kibana Timelion 没有从索引中绘制数据
- c++ - 简单提升序列化中的未定义参考错误
- javascript - 滚动时更新 HTML 画布高度
- django - 如何创建重用模型唯一键的序列化程序?
- python - 使用正则表达式清理熊猫系列
- c - 如何在 C 中用新的/更新的像素阵列更新/替换 SDL Surface 像素阵列?