Клиент Джерси в апплете не анализирует JSON

У меня есть простое приложение, которое можно использовать как в виде апплета, так и в качестве отдельного приложения. Он отправляет запрос в службу REST и пытается отобразить результат, который является List<City>.

Код класса города выглядит следующим образом:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class City implements Serializable {

    private Integer cityId;
    private String name;

    public Integer getCityId() {
        return cityId;
    }

    public void setCityId(Integer cityId) {
        this.cityId = cityId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Он использует jersey-bundle-1.17 для отправки запроса и получения ответа.

Код для отправки запроса и получения ответа:

ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client c = Client.create(clientConfig);
List<City> result = c.resource(resource url here).get(new GenericType<java.util.List<City>>(){});

После создания приложения у меня есть два файла jar - MyJar.jar с моим приложением и jersey-bundle-1.17.jar. Путь класса к майке указан в манифесте MyJar.jar.

Когда я запускаю свой файл jar как отдельное приложение (java -jar MyJar.jar), все в порядке, запрос отправляется, а ответ получен и десериализован в файл List<City>. Когда я запускаю свой файл jar в качестве апплета (в html-странице или апплете), запрос отправляется, ответ получен, но он не может десериализовать ответ на List<City> высказывание

A message body reader for Java class java.util.List, and Java type java.util.List<City>, and MIME media type application/json was not found

Я попытался добавить JacksonJsonProvider.class в список поставщиков Джерси, попытался десериализовать только в String, в City [] - он всегда говорит, что соответствующий читатель тела сообщения не найден при запуске из апплета. И все отлично работает при запуске в качестве настольного приложения.

Апплет определенно загружает jersy-bundle jar, как я вижу в журналах доступа к серверу, и запрос отправляется, но выглядит так, что он загружается неправильно (возможно, он игнорирует манифест jersy-bundle jar при загрузке, я не знаю) . Проблема возникает только тогда, когда код выполняется из апплета.

Кто-нибудь может мне помочь?


person panvik    schedule 14.08.2013    source источник


Ответы (1)


Проблема заключалась в том, что Jersey читал свойства и использовал рефлексию, а все эти действия были запрещены для ненадежного апплета. Это было не очевидно, так как в консоли Java не было ошибок. Мне пришлось поместить код парсинга в блок try/catch, перехватить любой Throwable и вывести его в консоль, и только тогда я мог видеть ошибки об ограничениях безопасности.

Чтобы решить эту проблему, мне пришлось самостоятельно подписать файл jar апплета, файл jar jersey и ВСЕ другие библиотеки, которые использовались Джерси.

person panvik    schedule 15.08.2013