2015-07-20 103 views
1

我正在嘗試使用球衣客戶端使用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

可能是什麼可能的原因呢?

+1

我從來沒有用過MOXy for XML,所以不知道爲什麼它不起作用。如果您沒有任何嚴格的要求來使用任何MOXY特定功能,則可以使用默認的jaxb提供程序。儘管你需要添加jersey-media-jaxb依賴項。還有一點需要注意的是,如果你想使用JAXBContext的包名,你需要一個ObjectFactory,它通常由jaxb編譯器創建。 –

+0

你說得對。我已經爲項目添加了一個ObjectFactory類。實際上,除了jersey-media-moxy之外,還需要jersey-media-jaxb的依賴關係才能讓這個例子發揮作用。謝謝! – George

回答

1

看起來jersey-media-jaxb需要額外的依賴關係,以便自定義的ContextResolver可以被球衣選中。然後使用標準的JAXB機制來定義從中獲取JAXBContext實例的JAXBContextFactory。
在這種情況下,在resttest.jaxb包中的jaxb.properties文件中指定了JAXBContextFactory類。

相關問題