如何向Wink Client注册Jackson提供商?
-
30-09-2019 - |
题
我正在尝试设置一个玩具应用程序(可能有一天可以转到真实的应用程序)。我遇到了Wink和Jackson的问题。我有两个应用程序:一个运行捷克服务器,似乎可以提供一些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);
这是我尝试运行支柱操作时收到的错误:
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);
很明显,数据越来越好,但是问题似乎在于杰克逊·森·普罗维德类未在Wink Client注册的事实。我已经看到了很多方法可以用眨眼服务器注册提供商,但没有眨眼客户端。
是否可以使第一个代码段正确运行?如果是这样,怎么样?
(顺便说一句,另一个问题可能是我缺少用户课上的注释。现在没有任何。也许我需要一些...)
解决方案
步骤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
豆并将其注入您的动作。然后,你可以打电话 new RestClient(clientConfig)
每次都不必担心复制整个设置。
其他提示
当尝试编写一些为我的REST插件发布对象的集成测试时,我遇到了这个问题。
然后,您可以为杰克逊提供者提供内联班提供新课程。
@Before
public void setup(){
javax.ws.rs.core.Application app = new javax.ws.rs.core.Application() {
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(JacksonJaxbJsonProvider.class);
return classes;
}
};
//create auth handler
clientConfig = new ClientConfig();
clientConfig.applications(app);
BasicAuthSecurityHandler basicAuthSecurityHandler = new BasicAuthSecurityHandler();
basicAuthSecurityHandler.setUserName(USERNAME);
basicAuthSecurityHandler.setPassword(PASSWORD);
clientConfig.handlers(basicAuthSecurityHandler);
//create client usin auth and provider
client = new RestClient(clientConfig);
}
然后,您可以发布并消耗带注释的对象。
@Test
public void aReadWriteTokenCanBeCreatedAsRequested(){
ClientResponse response = client.resource(resourceUrlToken).contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).post(readAndWriteToken);
assertEquals("Could not create token needed for test",200,response.getStatusCode());
readAndWriteToken = response.getEntity(TokenResource.class);
assertNotNull("Returned token does not have UUID",readAndWriteToken.getUuid());
}
如果您正在使用Maven,则可以确保Jackson在Test Class Path上(检查兼容版本):
<!-- TEST DEPENDENCIES -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
<version>1.9.1</version>
<scope>test</scope>
</dependency>
我希望我能为注册提供帮助;但是,关于注释,我认为杰克逊不需要任何东西才能试图实现价值。如果您缺少某些东西,您将获得其他类型的例外。