REST - SparkJava не обновляет объект JSON, когда я использую GET

У меня проблема с обновлением объекта json после изменения на странице, где я получаю текст. Ниже мой код и ответный API.

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;
    }
}

Где проблема? JSON обновляется, если я перезапущу сервер причала. В противном случае нет.


person kamiszczu    schedule 25.04.2017    source источник


Ответы (1)


Если я правильно понимаю, вы всегда получаете одни и те же результаты при повторном обращении в вашу службу? И вы ожидаете получить изменяющиеся записи, потому что исходный источник, из которого вы их извлекаете, меняется?

Это связано с тем, что вы читаете эту информацию с www.up.krakow.pl/uniwersytet/aktualnosci только один раз при создании экземпляра NewsService. И это делается только один раз в вашем основном методе:

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);
    }
}

Это просто исправление для получения всегда одних и тех же значений. В зависимости от того, как часто вызывается ваша служба, это может привести к большому количеству запросов к внутреннему серверу, к которому вы обращаетесь. В этом случае вы должны добавить какой-то кеш, который, например, будет извлекать новые данные только тогда, когда последние слишком стары. Но это другая история.

person P.J.Meisch    schedule 26.04.2017
comment
Спасибо за Ваш ответ. Ты прав. Я изменил код, и я сообщу о результате - person kamiszczu; 26.04.2017