我正在嘗試使用球衣客戶端使用XML消息進行一些RESTful請求。我不想爲任何端點提供服務,所以沒有涉及球衣服務器軟件包。
爲了測試目的,我使用公開可用的http://www.thomas-bayer.com/sqlrest/CUSTOMER測試服務。Jersey客戶端無法使用JAXB Moxy序列化發送/接收XML消息?
正如9.2.4. Using Custom 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註冊在其他客戶端:
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
裝在一個resttest項目這些文件克隆試驗後,可以用
mvn test
當我做一個POST請求,並傳遞一個客戶我希望簡單地執行實例後者由球衣客戶端(testCreateCustomerWithEntity)編組。
而當我正在做一個GET請求返回的客戶實體解組(testGetCustomer)。
但是這兩個測試都失敗了,MessageBodyProviderNotFoundException表示沒有爲媒體類型application/xml找到MessageBodyWriter/MessageBodyReader並輸入Customer。
我使用的是2.19版本,兩者球衣的客戶端和新澤西州的媒體MOXY庫與Oracle的Java 1.8.0_25
可能是什麼可能的原因呢?
我從來沒有用過MOXy for XML,所以不知道爲什麼它不起作用。如果您沒有任何嚴格的要求來使用任何MOXY特定功能,則可以使用默認的jaxb提供程序。儘管你需要添加jersey-media-jaxb依賴項。還有一點需要注意的是,如果你想使用JAXBContext的包名,你需要一個ObjectFactory,它通常由jaxb編譯器創建。 –
你說得對。我已經爲項目添加了一個ObjectFactory類。實際上,除了jersey-media-moxy之外,還需要jersey-media-jaxb的依賴關係才能讓這個例子發揮作用。謝謝! – George