gpt4 book ai didi

java - Jackson + reSTLet + tomcat - 无法注册助手 org.reSTLet.ext.jackson.JacksonConverter

转载 作者:行者123 更新时间:2023-11-28 22:02:32 33 4
gpt4 key购买 nike

我在 tomcat 环境中使用带有 reSTLet 的 jackson 时遇到问题。正如您可以从 restlet site 中读到的那样,他们保证 jackson 扩展

provides a plugin for the ConverterService which will automatically serialize and deserialize your Java objets returned by annotated methods in ServerResource subclasses.

还有那个

our Customer and Address classes are just regular serializablecbeans, with no special parent classes and no special annotations.

因此,为了模拟示例,我编写了一个简单的测试示例。这是服务器资源

public class TestUri extends ServerResource
{
@Get("json")
public User retrieve()
{
User u = new User("mail", "password", "nick", new Date());
u.setId(1);
return u;
}
}

这是客户端资源

    private static void testJacksonFromRestlet()
{
ClientResource cr = new ClientResource("<restlet-uri>");
User u = cr.get(User.class);
}

如果这很重要,我也尝试使用 curl

curl -i -X get -H "Content-Type: application/json" <url>

但是(正如预期的那样,我不得不说)当我尝试联系指定地址的 reSTLet 时,抛出了一个异常。

Unable to register the helper org.restlet.ext.jackson.JacksonConverter

java.lang.NoSuchFieldError: APPLICATION_YAML
at org.restlet.ext.jackson.JacksonConverter.<clinit>(JacksonConverter.java:60)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:379)
at org.restlet.engine.Engine.registerHelper(Engine.java:897)
at org.restlet.engine.Engine.registerHelpers(Engine.java:931)
at org.restlet.engine.Engine.registerHelpers(Engine.java:971)
at org.restlet.engine.Engine.discoverConverters(Engine.java:680)
at org.restlet.engine.Engine.<init>(Engine.java:508)
at org.restlet.engine.Engine.register(Engine.java:382)
at org.restlet.engine.Engine.register(Engine.java:368)
at org.restlet.engine.Engine.getInstance(Engine.java:252)
at org.restlet.data.Method.<init>(Method.java:334)
at org.restlet.data.Method.<init>(Method.java:393)
at org.restlet.data.Method.<init>(Method.java:358)
at org.restlet.data.Method.<clinit>(Method.java:57)
at org.restlet.resource.ClientResource.<init>(ClientResource.java:405)

这些是我在服务器上部署的包 Deployed packages

我不知道怎么办。对我来说,似乎以下一项或多项是正确的

  • 我在图书馆方面遗漏了一些东西。但是,我不知道yaml代表什么,我也不想用它,只有简单的json序列化器/反序列化器
  • 我在 web.xml 文件中遗漏了一些东西(目前非常简单,只包含重定向应用程序)。但是,我不知道如何配置它才能正确使用 jackson
  • 我在代码中遗漏了一些东西。

编辑 1

我的问题似乎与 this 有关所以问题也有this .但是,经过多次尝试,我无法解决。

除此之外,我还尝试从 META-INF/services 上的 org.reSTLet.ext.jackson 导出 META-INF/services 文件夹,但我不知道它是否有意义,因为问题仍然存在。

我还尝试从我的 Application 调用 Engine.getInstance().getRegisteredConverters().add(new JacksonConverter());,但结果是 java.lang.NoClassDefFoundError:无法初始化类 org.reSTLet.ext.jackson.JacksonConverter

所以,我现在完全卡住了。

最佳答案

我建议向后退一步,比如 -为什么不将传入数据直接转换为 USER 类,而是将其存储为 JSON 对象,然后使用 Jackson 的 ObjectMapper 来获取 User 实例?

有了这个你就可以知道抛出错误的正确阶段。我正在使用 Jackson 来做一些与您正在使用的非常相似的事情,到目前为止我没有遇到任何问题。

一旦将输出保存到 JSON 对象中,就可以使用 ObjectMapper 类的 readValue 方法

** 示例代码**

在我的例子中,响应是一个 JSONObjects 数组,所以这里是它在这种情况下的工作方式。

      ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray(response);
for (int i=0; i< array.length(); i++){
JSONObject obj = array.getJSONObject(i);
POJOClass = mapper.readValue(obj.toString(),POJO.class);
dataArr.add(data);
}

关于java - Jackson + reSTLet + tomcat - 无法注册助手 org.reSTLet.ext.jackson.JacksonConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26669391/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com