我正在尝试设置一个玩具应用程序(有一天它可能会变成一个真正的应用程序)。我遇到了 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)
而不必担心复制整个设置。