我正在尝试使用jersey客户机使用XML消息发出一些RESTful请求。我不想为任何端点服务,所以没有涉及到泽西服务器包。
为了测试目的,我使用了可公开访问的http://www.thomas-bayer.com/sqlrest/CUSTOMER测试服务。
正如在9.2.4.使用自定义JAXBContext中所述,我有一个自定义的ContextResolver类,即:
@Provider
@Produces({"application/xml"})
public class MyJaxbContextProvider implements ContextResolver<JAXBContext> {
private JAXBContext context;
public JAXBContext getContext(Class<?> type) {
if (context == null) {
try {
context = JAXBContext.newInstance("resttest.jaxb");
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
return context;
}
}此ContextResolver在rest客户端中注册:
client = ClientBuilder.newClient().register(MoxyXmlFeature.class).register(MyJaxbContextProvider.class);我的客户实体是:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"id",
"firstname",
"lastname",
"street",
"city"
})
@XmlRootElement(name = "CUSTOMER")
public class Customer {
@XmlElement(name = "ID")
protected Integer id;
@XmlElement(name = "FIRSTNAME")
protected String firstName;
@XmlElement(name = "LASTNAME")
protected String lastName;
@XmlElement(name = "STREET")
protected String street;
@XmlElement(name = "CITY")
protected String city;
// getters and setters following
// ...
}最后,进行实际请求的测试类是:
public class RestClientTest {
private static Client client;
@BeforeClass
public static void beforeClass() {
client = ClientBuilder.newClient().register(MoxyXmlFeature.class).register(MyJaxbContextProvider.class);
}
@Test
public void testCreateCustomerWithEntity() { // Error
Customer customer = new Customer();
customer.setId(50);
customer.setFirstName("Nikol");
Response res = client.target("http://www.thomas-bayer.com/sqlrest/CUSTOMER/").request()
.post(entity(customer, MediaType.APPLICATION_XML_TYPE));
}
@Test
public void testGetCustomer() { // Error
Customer customer = client.target("http://www.thomas-bayer.com/sqlrest/CUSTOMER/3/").request()
.get(new GenericType<Customer>() {});
assertThat(customer.getId(), equalTo(3));
}
}我已将这些文件打包在https://github.com/georgeyanev/resttest的these测试项目中。
在克隆之后,可以简单地使用
mvn test我希望当我发出一个POST请求并传递一个客户实例时,客户实例将由jersey (testCreateCustomerWithEntity)进行编组。
当我提出GET请求时,返回的客户实体将被解除封送(testGetCustomer)。
但是这两个测试都失败了,因为MessageBodyProviderNotFoundException表示没有为媒体类型的application/xml和类型Customer找到MessageBodyWriter/MessageBodyReader。
我使用了带有oracle 1.8.0_25的jersey和jersey moxy库的2.19版本。
可能的原因是什么?
发布于 2015-07-20 11:32:23
看来,为了让泽西选择定制的ContextResolver,还需要对jersey-media-jaxb提供额外的依赖。然后使用标准的JAXB机制来定义将从其中获得JAXBContextFactory实例的JAXBContext。
在这种情况下,JAXBContextFactory类是在jaxb.properties文件中resttest.jaxb包中指定的。
https://stackoverflow.com/questions/31512313
复制相似问题