2013-08-23 77 views
1

我一直在這個問題上停留了很多天,現在正在尋找一些指導來幫助解決問題。我對Metro下的jax-ws有相當豐富的經驗,但這是我第一次和澤西一起進入jax-rs。爲了簡化運動部件,我將球衣 - 例子 - moxy代碼作爲起點。使用JAXB在Jersey 2.2下使用JOXB處理PUT問題MOXy

我修改了示例項目以接受XML和JSON。我認爲這很簡單,但我似乎錯過了一些東西,因爲這是一個痛苦的經歷。當我請求「application/xml」時,代碼運行時沒有問題,並且GET將適用於「application/json」,但是當我嘗試使用JSON執行PUT時,服務器返回500狀態碼。我可以看到JSON是在PUT請求中發送的,但是服務器似乎遇到了接受JSON的問題。

這是修改的CustomerResource.java文件段。我所做的只是將MediaType.APPLICATION_JSON參數添加到Produces and Consumes註釋中。

@Path("/customer") 
public class CustomerResource { 

    private static Customer customer = createInitialCustomer(); 

    @GET 
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
    public Customer getCustomer() { 
    return customer; 
    } 

    @PUT 
    @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
    public void setCustomer(Customer c) { 
    customer = c; 
    } 

    private static Customer createInitialCustomer() { 
    Customer result = new Customer(); 

    result.setName("Jane Doe"); 
    result.setAddress(new Address("123 Any Street", "My Town")); 
    result.getPhoneNumbers().add(new PhoneNumber("work", "613-555-1111")); 
    result.getPhoneNumbers().add(new PhoneNumber("cell", "613-555-2222")); 

    return result; 
    } 
} 

我修改MoxyAppTest.java文件請求在單獨的測試XML和JSON MediaTypes:

@Test 
public void testJaxBCustomer() throws Exception { 
    final WebTarget webTarget = target().path("customer"); 

    Customer customer = webTarget.request(MediaType.APPLICATION_XML).get(Customer.class); 
    assertEquals("Jane Doe", customer.getName()); 

    customer.setName("Tom Dooley"); 
    Response response = webTarget.request(MediaType.APPLICATION_XML).put(Entity.xml(customer)); 
    assertEquals(204, response.getStatus()); 

    Customer updatedCustomer = webTarget.request(MediaType.APPLICATION_XML).get(Customer.class); 
    assertEquals(customer, updatedCustomer); 
} 

@Test 
public void testJsonCustomer() throws Exception { 
    final WebTarget webTarget = target().path("customer"); 

    Customer customer = webTarget.request(MediaType.APPLICATION_JSON).get(Customer.class); 
    assertEquals("Tom Dooley", customer.getName()); 

    customer.setName("Bobby Boogie"); 
    Response response = webTarget.request(MediaType.APPLICATION_JSON).put(Entity.json(customer)); 
    assertEquals(204, response.getStatus()); 

    Customer updatedCustomer = webTarget.request(MediaType.APPLICATION_JSON).get(Customer.class); 
    assertEquals(customer, updatedCustomer); 
} 

在我添加JsonMoxyConfigurationContextResolver類App.java文件和一個registerInstances()調用在createApp()方法。 (請注意,這不會改變結果)。

public static ResourceConfig createApp() { 
    return new ResourceConfig().packages("org.glassfish.jersey.examples.xmlmoxy") 
      .register(new MoxyXmlFeature()) 
      .registerInstances(new JsonMoxyConfigurationContextResolver());  
} 

@Provider 
final static class JsonMoxyConfigurationContextResolver implements ContextResolver<MoxyJsonConfig> { 

    @Override 
    public MoxyJsonConfig getContext(Class<?> objectType) { 
     final MoxyJsonConfig configuration = new MoxyJsonConfig(); 

     Map<String, String> namespacePrefixMapper = new HashMap<String, String>(1); 
     namespacePrefixMapper.put("http://www.w3.org/2001/XMLSchema-instance", "xsi"); 

     configuration.setNamespacePrefixMapper(namespacePrefixMapper); 
     configuration.setNamespaceSeparator(':'); 

     return configuration; 
    } 
} 

這裏是示出 「應用/ xml」 的PUT是成功的一個204的狀態的日誌段:

Aug 23, 2013 1:23:50 AM org.glassfish.jersey.filter.LoggingFilter log 
INFO: 3 * LoggingFilter - Request received on thread main 
3 > PUT http://localhost:9998/customer 
3 > Accept: application/xml 
3 > Content-Type: application/xml 
<?xml version="1.0" encoding="UTF-8"?> 
<customer><personal-info><name>Tom Dooley</name></personal-info><contact-info><address><city>My Town</city><street>123 Any Street</street></address><phone-number type="work">613-555-1111</phone-number><phone-number type="cell">613-555-2222</phone-number></contact-info></customer> 

Aug 23, 2013 1:23:50 AM org.glassfish.jersey.filter.LoggingFilter log 
INFO: 4 * LoggingFilter - Response received on thread main 
4 < 204 
4 < Date: Fri, 23 Aug 2013 05:23:50 GMT 

現在爲 「應用程序/ JSON」 日誌:

Aug 23, 2013 1:23:51 AM org.glassfish.jersey.filter.LoggingFilter log 
INFO: 3 * LoggingFilter - Request received on thread main 
3 > PUT http://localhost:9998/customer 
3 > Accept: application/json 
3 > Content-Type: application/json 
{"personal-info":{"name":"Bobby Boogie"},"contact-info":{"address":{"city":"My Town","street":"123 Any Street"},"phone-number":[{"type":"work","value":"613-555-1111"},{"type":"cell","value":"613-555-2222"}]}} 

Aug 23, 2013 1:23:51 AM org.glassfish.jersey.filter.LoggingFilter log 
INFO: 4 * LoggingFilter - Response received on thread main 
4 < 500 
4 < Date: Fri, 23 Aug 2013 05:23:50 GMT 
4 < Content-Length: 0 
4 < Connection: close 

正如您所看到的,服務器正在返回一個500的狀態代碼。灰熊測試容器不會生成一個捕獲任何異常信息的日誌,並且它看起來好像在500響應中沒有返回任何內容。有沒有一種方法可以獲得額外的異常細節?

關於如何進行的任何建議?

謝謝!

+0

請考慮對你的問題更短。你會更有可能得到答案。 – IvanH

回答

1

其實是什麼原因導致這個問題的一個組合:

  • @XmlPath註釋上Customer豆和
  • namespacePrefixMapper,你設置成MoxyJsonConfig

這期間導致NullPointerException(聯合國)編組JSON。這已在MOXy的夜間版本(2.5.12.6.1)中得到修復。您可以從Nightly Builds頁面下載。

如果你不想改變莫西版本的那一刻,只需刪除此行

configuration.setNamespacePrefixMapper(namespacePrefixMapper); 
JsonMoxyConfigurationContextResolver

,你應該罰款。

關於日誌問題 - 我們知道它和它的生物固定的(應Jersey 2.3解決)。

+0

在我一直堅持我已經重寫的例子沒有@XmlPath註釋和問題依然存在,但是,移除** configuration.setNamespacePrefixMapper(namespacePrefixMapper)**行的固定問題的時間。我可以發誓我在之前的嘗試中嘗試過,但看起來像我沒有。非常感謝您的幫助,非常感謝! – Hacksaw

相關問題