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类上缺少注释.现在没有任何注释.也许我需要一些......)
第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)每次拨打电话,而不必担心复制整个设置.
| 归档时间: |
|
| 查看次数: |
9506 次 |
| 最近记录: |