0

我有一个简单的应用程序,可以用作小程序和独立应用程序。它向 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>. 当我在发送小程序(在 html 页面或 appletviewer 中)请求时运行我的 jar 文件时,会收到响应,但它无法反序列化对这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 添加到 Jersey 提供程序列表中,尝试仅反序列化到 String 到 City[] - 它总是说从 applet 运行时找不到合适的消息正文阅读器。当作为桌面应用程序运行时,一切正常。

Applet 肯定会加载 jersey-bundle jar,因为我在服务器访问日志中看到它并发送了请求,但它看起来加载不正确(也许它在加载时忽略 jersey-bundle jar 的清单,我不知道) . 仅当从小程序执行代码时才会出现问题。

有人可以帮我吗?

4

1 回答 1

0

问题是 Jersey 读取属性并使用反射,并且所有这些操作都被禁止用于不受信任的小程序。这并不明显,因为 Java 控制台中没有错误。我必须将解析代码放入 try/catch 块,捕获任何 Throwable 并将其打印到控制台,然后我才能看到有关安全限制的错误。

为了解决这个问题,我必须对我的 applet jar 文件、jersey jar 文件和 Jersey 使用的所有其他库进行自签名

于 2013-08-15T11:33:34.007 回答