我正在尝试设置一个玩具应用程序(有一天它可能会变成一个真正的应用程序)。我遇到了 Wink 和 Jackson 的问题。我有两个应用程序:一个在 jetty 上运行 wink-server 并且似乎提供了一些 JSON 数据就好了;一个在 jetty 上运行 wink-client 并接收 JSON 数据就好了。问题在于自动将 JSON 数据反序列化回我的 Java bean。

这是我在眨眼客户端操作中使用的代码:

RestClient client = new RestClient();
Resource resource = client.resource("http://localhost:8081/helloworld");
User user = resource.accept(MediaType.APPLICATION_JSON).get(User.class);

这是我尝试运行 Struts 操作时收到的错误:
java.lang.RuntimeException: No javax.ws.rs.ext.MessageBodyReader found for type class my.package.structure.User and media type application/json. Verify that all entity providers are correctly registered.
org.apache.wink.client.internal.handlers.ClientResponseImpl.readEntity(ClientResponseImpl.java:123)
org.apache.wink.client.internal.handlers.ClientResponseImpl.getEntity(ClientResponseImpl.java:65)
org.apache.wink.client.internal.handlers.ClientResponseImpl.getEntity(ClientResponseImpl.java:52)
org.apache.wink.client.internal.ResourceImpl.invoke(ResourceImpl.java:186)
org.apache.wink.client.internal.ResourceImpl.get(ResourceImpl.java:294)
my.package.structure.action.HelloWorldAction.execute(HelloWorldAction.java:29)
...

如果我用下面的行替换第一个代码片段中的最后一行,一切正常。
String message = resource.accept(MediaType.APPLICATION_JSON).get(String.class);
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(message, User.class);

很明显,数据传递得很好,但问题似乎在于 JacksonJsonProvider 类没有在 Wink 客户端注册。我见过很多向 Wink 服务器注册提供程序的方法,但没有向 Wink 客户端注册。

是否可以让第一个代码片段正常运行?如果是这样,如何?

(顺便说一句,另一个问题可能是我的 User 类上缺少注释。现在没有。也许我需要一些......)

最佳答案

步骤 1:创建一个扩展 javax.ws.rs.core.Application 的类,允许您设置单例。

import java.util.Collections;
import java.util.Set;
import javax.ws.rs.core.Application;

public class ClientApplication extends Application {

    private Set<Object> singletons = Collections.emptySet();

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }

    public void setSingletons(final Set<Object> singletons) {
        this.singletons = singletons;
    }
}

第 2 步:在您的操作中,为您的 org.apache.wink.client.ClientConfig 创建一个 org.apache.wink.client.RestClient 。这允许您将 org.codehaus.jackson.jaxrs.JacksonJsonProvider 添加到您的提供者列表中。
ClientApplication clientApplication = new ClientApplication();
Set<Object> s = new HashSet<Object>();
s.add(new JacksonJsonProvider());
clientApplication.setSingletons(s);
ClientConfig clientConfig = new ClientConfig().applications(clientApplication);
RestClient restClient = new RestClient(clientConfig);

第 3 步:创建 org.apache.wink.client.Resource ,使用 get(Class<T> responseEntity) 方法,现在一切都会按预期工作。
Resource resource = client.resource("http://localhost:8081/helloworld");
User user = resource.accept(MediaType.APPLICATION_JSON).get(User.class);

如果您想真正熟练地使用它,可以使用 Spring 设置一个 ClientConfig bean 并将其注入(inject)到您的操作中。然后,您可以每次都调用 new RestClient(clientConfig) 而不必担心复制整个设置。

10-06 01:38