【问题标题】:Receive data from static class从静态类接收数据
【发布时间】:2018-03-06 13:52:13
【问题描述】:

我有 utils 类,它以静态方法从外部 API 获取数据:

@Component
public class Util {


    private Util() {

    }


    public static List<Movie> getMovies(){
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        String resourceURL = "< a loooong url>" 
        HttpEntity<String> entity = new HttpEntity<String>(headers);
        ResponseEntity<Results> response = restTemplate.exchange(resourceURL,  HttpMethod.GET, entity, Results.class);
        Results results = response.getBody();
        List<Movie> movies = results.getResults();
        return movies;
    }
}

我知道数据已从服务器正确获取,但我不知道为什么我不能将其传输到我的休息控制器:

@RestController
public class MovieController {



    @RequestMapping(value ="/movies", method = RequestMethod.GET)
    public List<Movie> getMovies(){
        return Util.getMovies();
    }

}

它返回给我 404 没有可用的消息..

有什么想法吗? ;)

问候

【问题讨论】:

  • HTTP 状态码 404 为“未找到”。这意味着您的请求与您注册的任何端点都不匹配。确保您的 GET 请求指向 localhost:port/movies。
  • 一般来说,你的类而不是它的方法不应该是静态的。只需使用@Component 对其进行注释,Spring 就会创建一个实例,您可以将其注入到您的控制器中。我还建议将 Util 重命名为有意义的名称,例如 MovieService。是什么引发了 404、对 MovieController 或 Util restTemplate 调用的调用?
  • 可能是他的控制器方法中没有@ResponseBody注解。
  • 您如何尝试访问您的端点?

标签: java spring rest api http


【解决方案1】:

您必须将方法设为静态是否有原因?将其切换为非静态方法,然后您可以在控制器中自动装配它。

@Component
public class Util {

    public List<Movie> getMovies(){
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        String resourceURL = "< a loooong url>" 
        HttpEntity<String> entity = new HttpEntity<String>(headers);
        ResponseEntity<Results> response = restTemplate.exchange(resourceURL,  HttpMethod.GET, entity, Results.class);
        Results results = response.getBody();
        List<Movie> movies = results.getResults();
        return movies;
    }
}

由于它是一个组件,您现在可以自动装配它,并且您还必须将 @ResponseBody 注释添加到您的控制器。

@RestController
public class MovieController {

    @Autowired
    private Util util;

    @RequestMapping(value ="/movies", method = RequestMethod.GET)
    public @ResponseBody List<Movie> getMovies(){
        return util.getMovies();
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2010-10-12
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多