如何在Wink客户端注册Jackson提供商?

jac*_*bko 3 java json jax-rs jackson apache-wink

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

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

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

这是我尝试运行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)
...
Run Code Online (Sandbox Code Playgroud)

如果我用下面的代码替换第一个代码片段中的最后一行,一切都运行正常,花花公子.

String message = resource.accept(MediaType.APPLICATION_JSON).get(String.class);
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(message, User.class);
Run Code Online (Sandbox Code Playgroud)

很明显,数据很好,但问题似乎在于JacksonJsonProvider类没有在Wink客户端注册.我已经看到很多方法用Wink服务器注册提供程序,但不是Wink客户端.

是否可以使第一个代码段正常运行?如果是这样,怎么样?

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

jac*_*bko 7

第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;
    }
}
Run Code Online (Sandbox Code Playgroud)

第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);
Run Code Online (Sandbox Code Playgroud)

第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);
Run Code Online (Sandbox Code Playgroud)

如果你想对它真的很光滑,你可以使用Spring设置一个ClientConfigbean并将其注入你的行动中.然后,您可以new RestClient(clientConfig)每次拨打电话,而不必担心复制整个设置.