我正在尝试设置一个玩具应用程序(可能有一天可以转到真实的应用程序)。我遇到了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>

我希望我能为注册提供帮助;但是,关于注释,我认为杰克逊不需要任何东西才能试图实现价值。如果您缺少某些东西,您将获得其他类型的例外。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top