JAX-RS/RestEasy 客户端和 JSON-P
JAX-RS/RestEasy Client and JSON-P
在使用 JAX-RS 和 RestEasy 作为实现编写的 REST 客户端中,我正在尝试通过 POST 将 JsonObject 发送到 WebService。项目使用JSON-P的参考实现,org.glassfish.javax.json.
当我尝试发送请求时出现以下异常:
javax.ws.rs.ProcessingException:RESTEASY003215:找不到内容类型 application/json 类型的作者:org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl
pom.xml 中存在以下工件:
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.6.3.SP1</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.6.3.SP1</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-json-p-provider</artifactId>
<version>3.6.3.SP1</version>
</dependency>
根据我在文档中阅读的内容,应该是所有必要的。
调用的请求如下:
final JsonObjectBuilder credentialsBuilder = Json.createObjectBuilder();
credentialsBuilder.add("username", configuration.getServiceUser());
credentialsBuilder.add("password", configuration.getServicePassword());
final Entity<JsonObject> credentials = Entity
.json(credentialsBuilder.build());
final Response response = ClientBuilder
.newClient()
.target("http://www.example.org/some/url")
.request(MediaType.APPLICATION_JSON)
.post(credentials);
我错过了什么?
您的提供者似乎没有注册;根据 how/where 您使用的是 Resteasy,您可能需要进行额外的配置以确保它为您挑选那种东西 (http://docs.jboss.org/resteasy/docs/3.6.3.Final/userguide/html_single)。
例如,如果您正在使用 servlet 配置,则可能需要使用 resteasy-servlet-initializer
,或添加 spring 帮助程序等。
请注意,如果您想要(或只是测试),您很可能可以在构建时将 JSON-P 提供程序显式注册到客户端、目标或请求本身
感谢提示。这确实是解决方案。该应用程序是一个命令行客户端 (Java SE)。解决方案是 - 除了添加依赖项 - 在创建客户端实例时注册提供者:
ClientBuilder
.newClient()
.register(JsonArrayProvider.class)
.register(JsonObjectProvider.class)
.register(JsonStructureProvider.class)
.register(JsonValueProvider.class)
... // create request
在使用 JAX-RS 和 RestEasy 作为实现编写的 REST 客户端中,我正在尝试通过 POST 将 JsonObject 发送到 WebService。项目使用JSON-P的参考实现,org.glassfish.javax.json.
当我尝试发送请求时出现以下异常:
javax.ws.rs.ProcessingException:RESTEASY003215:找不到内容类型 application/json 类型的作者:org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl
pom.xml 中存在以下工件:
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.6.3.SP1</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.6.3.SP1</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-json-p-provider</artifactId>
<version>3.6.3.SP1</version>
</dependency>
根据我在文档中阅读的内容,应该是所有必要的。
调用的请求如下:
final JsonObjectBuilder credentialsBuilder = Json.createObjectBuilder();
credentialsBuilder.add("username", configuration.getServiceUser());
credentialsBuilder.add("password", configuration.getServicePassword());
final Entity<JsonObject> credentials = Entity
.json(credentialsBuilder.build());
final Response response = ClientBuilder
.newClient()
.target("http://www.example.org/some/url")
.request(MediaType.APPLICATION_JSON)
.post(credentials);
我错过了什么?
您的提供者似乎没有注册;根据 how/where 您使用的是 Resteasy,您可能需要进行额外的配置以确保它为您挑选那种东西 (http://docs.jboss.org/resteasy/docs/3.6.3.Final/userguide/html_single)。
例如,如果您正在使用 servlet 配置,则可能需要使用 resteasy-servlet-initializer
,或添加 spring 帮助程序等。
请注意,如果您想要(或只是测试),您很可能可以在构建时将 JSON-P 提供程序显式注册到客户端、目标或请求本身
感谢提示。这确实是解决方案。该应用程序是一个命令行客户端 (Java SE)。解决方案是 - 除了添加依赖项 - 在创建客户端实例时注册提供者:
ClientBuilder
.newClient()
.register(JsonArrayProvider.class)
.register(JsonObjectProvider.class)
.register(JsonStructureProvider.class)
.register(JsonValueProvider.class)
... // create request