2017-04-25 24 views
0

我在获取文本的页面发生更改后,更新对象json出现问题。在我的代码和响应API下面。REST - 当我使用GET时,SparkJava没有更新对象JSON

响应API:

[ 
    { "title": "„Jak wykorzystać media i nowoczesne technologie w edukacji?” – warsztaty dla nauczycieli", 
     "url": "http://www.up.krakow.pl/uniwersytet/aktualnosci/1772-jak-wykorzystac-media-i-nowoczesne-technologie-w-edukacji-warsztaty-dla-nauczycieli" 
    } 
] 

Java服务:

public class NewsService implements NewsServiceInterface { 
    private Document doc = Jsoup.connect("http://www.up.krakow.pl/uniwersytet/aktualnosci").get(); 
    private Elements links = doc.select("div.page-header"); 
    private LinkedHashMap<String, String> store = new LinkedHashMap<>(); 

    public NewsService() throws IOException { 
    } 

    @Override 
    public List<News> getNews() { 
     List<News> newsList = new ArrayList<>(); 
     for (Element element : links) { 
      String title = element.select("a[href]").text(); // get only text 
      String url = "http://www.up.krakow.pl" + element.select("a[href]").attr("href"); // get only link 
      if (!store.containsKey(title)) { 
       store.put(title, url); 
      } 
     } 
     for (Map.Entry<String, String> entry : store.entrySet()) { 
      newsList.add(new News(entry.getKey(), entry.getValue())); 
     } 
     return Lists.reverse(newsList); 
    } 
} 

Java的控制器:

public class NewsController { 
    private static final String API_CONTEXT = "/api/v1"; 
    public NewsController(final NewsService newsService) { 
     get(API_CONTEXT + "/getnews", (request, response) -> {   
      return newsService.getNews(); 
     }, json()); 
} 

的Java POJO:

public class News implements Serializable { 
    @Expose 
    @SerializedName("id") 
    private String id; 
    @Expose 
    @SerializedName("title") 
    private String title; 
    @Expose 
    @SerializedName("url") 
    private String url; 
    @Expose 
    @SerializedName("counterAllNews") 
    private String counterAllNews; 

    public News() { 
    } 

    public News(String title, String url) { 
     this.title = title; 
     this.url = url; 
    } 

// getter and setter 

} 

的Java主营:

public class Hello { 
    public static void main(String[] args) throws IOException { 
     try { 
      new NewsController(new NewsService()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Java的JSON:

public class JsonUtil { 
    public static String toJson(Object object) { 
     return new Gson().toJson(object); 
    } 


    public static ResponseTransformer json() { 
     return JsonUtil::toJson; 
    } 
} 

在哪里的问题?如果我重新启动jetty服务器,JSON将更新。否则不是。

回答

2

如果我理解正确,在重复调用您的服务时总是会得到相同的结果?你希望得到更改的条目,因为你获取它们的原始来源发生了变化?

这是因为你读www.up.krakow.pl/uniwersytet/aktualnosci只有一次当NewsService被实例化的信息。那就是在main方法只需要做一次:

new NewsController(new NewsService()); 

更改NewsService实施,使你重新获取每个消息数据得到:

public class NewsService implements NewsServiceInterface { 
    private LinkedHashMap<String, String> store = new LinkedHashMap<>(); 

    public NewsService() throws IOException { 
    } 

    @Override 
    public List<News> getNews() { 
     Document doc = Jsoup.connect("http://www.up.krakow.pl/uniwersytet/aktualnosci").get(); 
     Elements links = doc.select("div.page-header"); 
     List<News> newsList = new ArrayList<>(); 
     for (Element element : links) { 
      String title = element.select("a[href]").text(); // get only text 
      String url = "http://www.up.krakow.pl" + element.select("a[href]").attr("href"); // get only link 
      if (!store.containsKey(title)) { 
       store.put(title, url); 
      } 
     } 
     for (Map.Entry<String, String> entry : store.entrySet()) { 
      newsList.add(new News(entry.getKey(), entry.getValue())); 
     } 
     return Lists.reverse(newsList); 
    } 
} 

这仅仅是用于获取总是修复相同的值。取决于您的服务被调用的频率,这可能会导致对正在查询的后端服务器提出大量请求。在这种情况下,您应该添加某种缓存,例如只有在最后一个过旧时从后面获取新数据。但这是一个不同的故事。

+0

感谢您的回答。你是对的。我改变了代码,我会通知有关结果 – kamiszczu

+0

好吧,它的工作。谢谢。 – kamiszczu