首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泽西客户端不能用JAXB Moxy序列化发送/接收XML消息?

泽西客户端不能用JAXB Moxy序列化发送/接收XML消息?
EN

Stack Overflow用户
提问于 2015-07-20 08:52:04
回答 1查看 687关注 0票数 1

我正在尝试使用jersey客户机使用XML消息发出一些RESTful请求。我不想为任何端点服务,所以没有涉及到泽西服务器包。

为了测试目的,我使用了可公开访问的http://www.thomas-bayer.com/sqlrest/CUSTOMER测试服务。

正如在9.2.4.使用自定义JAXBContext中所述,我有一个自定义的ContextResolver类,即:

代码语言:javascript
复制
@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客户端中注册:

代码语言:javascript
复制
client = ClientBuilder.newClient().register(MoxyXmlFeature.class).register(MyJaxbContextProvider.class);

我的客户实体是:

代码语言:javascript
复制
@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
  // ...
}

最后,进行实际请求的测试类是:

代码语言:javascript
复制
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测试项目中。

在克隆之后,可以简单地使用

代码语言:javascript
复制
mvn test

我希望当我发出一个POST请求并传递一个客户实例时,客户实例将由jersey (testCreateCustomerWithEntity)进行编组。

当我提出GET请求时,返回的客户实体将被解除封送(testGetCustomer)。

但是这两个测试都失败了,因为MessageBodyProviderNotFoundException表示没有为媒体类型的application/xml和类型Customer找到MessageBodyWriter/MessageBodyReader。

我使用了带有oracle 1.8.0_25的jersey和jersey moxy库的2.19版本。

可能的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-20 11:32:23

看来,为了让泽西选择定制的ContextResolver,还需要对jersey-media-jaxb提供额外的依赖。然后使用标准的JAXB机制来定义将从其中获得JAXBContextFactory实例的JAXBContext。

在这种情况下,JAXBContextFactory类是在jaxb.properties文件中resttest.jaxb包中指定的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31512313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档