2017-04-25 9 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

私が正しく理解していれば、サービスを繰り返し呼び出すと、常に同じ結果が得られますか?また、元のソースを取得する場所が変更されるため、エントリを変更することを期待していますか?あなたはNewsServiceがインスタンス化される度だけwww.up.krakow.pl/uniwersytet/aktualnosciからその情報を読み取るため

です。あなたは、すべてのニュースデータを再フェッチするように取得するには、

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

関連する問題