当前位置: 首页 > 知识库问答 >
问题:

使用JAXBElement在JAXBElement下使用MOXy处理JSON的问题

桂和同
2023-03-14

我扩展了moxy代码以使用XML模式定义,而不是JAXB注释bean。xjc编译的XML模式生成与原始示例相同的XML和JSON编码。

我按照jersey的说明,使用ObjectFactory在CustomerResource中生成JAXBElement客户对象表示。JAVA我还按照描述修改了客户机。我还将Jersey 2.2下的JAXB与MOXy结合在一起,解决了PUT问题中描述的JSON处理问题

媒体类型。应用程序XML功能完美,并且是MediaType。应用程序_JSON适用于GETs,但客户端无法将JSON打包到带有“MessageBodyWriter not found”的PUT上。将引发以下异常:

testJsonCustomer(org.glassfish.jersey.examples.jaxbmoxy.MoxyAppTest)  Time elapsed: 0.113 sec  <<< ERROR!
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class javax.xml.bind.JAXBElement, genericType=class javax.xml.bind.JAXBElement.
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:191)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
at org.glassfish.jersey.filter.LoggingFilter.aroundWriteTo(LoggingFilter.java:268)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1005)
at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:430)
at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:290)

下面是我如何修改CustomerResource的。爪哇:

private static ObjectFactory factory = new ObjectFactory();

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public JAXBElement<Customer> getCustomer() {
    return factory.createCustomer(customer);
}

@PUT
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public JAXBElement<Customer> setCustomer(Customer c) {
    customer = c;      
    return factory.createCustomer(customer);
}

下面是我如何发出PUT请求(与功能XML相同):

@Override
protected void configureClient(ClientConfig clientConfig) {
    clientConfig.register(new MoxyXmlFeature());
}

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

    // Target customer entity with GET and verify inital customer name.
    Customer customer = webTarget.request(MediaType.APPLICATION_JSON).get(Customer.class);
    assertEquals("Tom Dooley", customer.getPersonalInfo().getName());

    // Update customer name with PUT and verify operation successful.
    customer.getPersonalInfo().setName("Bobby Boogie");
    Response response = webTarget.request(MediaType.APPLICATION_JSON).put(Entity.json(factory.createCustomer(customer)));
    assertEquals(200, response.getStatus());

    // Target customer entity with GET and verify name updated.
    Customer updatedCustomer = webTarget.request(MediaType.APPLICATION_JSON).get(Customer.class);
    assertEquals(customer.getPersonalInfo().getName(), updatedCustomer.getPersonalInfo().getName());
}

谢谢你的帮助!

共有1个答案

章飞章
2023-03-14

你面临的问题在这一行:

Response response = webTarget.request(MediaType.APPLICATION_JSON).put(Entity.json(factory.createCustomer(customer)));

基本上,您将JAXBElement传递给Entity#json方法,但是运行时没有关于泛型类型的信息,您需要提供它。这就是一般实体

webTarget
    .request(MediaType.APPLICATION_JSON)
    .put(Entity.json(new GenericEntity<JAXBElement<Customer>>(factory.createCustomer(customer)) {}));
 类似资料:
  • 我已经在这个问题上纠缠了好几天,现在正在寻找一些指导来帮助解决这个问题。我在Metro下使用jax ws有着丰富的经验,但这是我第一次使用Jersey进入jax rs。为了简化运动部件,我以moxy代码为起点。 我修改了示例项目以接受XML和JSON。我以为这很简单,但我似乎错过了一些东西,因为这是一次痛苦的经历。当我请求“application/xml”时,代码运行没有问题,GET将用于“app

  • 问题内容: 我有一个使用Spring(v4.0.5)的http服务。它的http端点是使用Spring Web MVC配置的。响应是从模式生成的带有JAXB2注释的类。由于生成的JAXB类不带有注释(因此不能修改架构来对此进行注释),因此响应被打包。我不得不为使XML编组工作而斗争。无论如何,它都在工作。 现在,我正在设置JSON编组。我正在遇到的是获取具有“信封” 特征的JSON文档。 我想整理

  • 问题内容: 我有一个关于JAXB的简单问题。这是示例代码: 如何初始化使用其他对象的String的输入元素? 问题答案: 您可以直接创建一个实例,或者如果您是从XML模式生成的Java模型,请在生成的类上使用convience方法。 schema.xsd 上面的演示代码基于从以下XML模式生成的Java模型。你会得到一个原因摆在首位属性是当你有一个既是元素和。 根 以下类是从中生成的,并且包含与您

  • 以下是我想要的: 相反,在编组之后,我得到的是: 是不是要从元素中删除'xmlns:ns4'和其他内容? 我解决了这个。需要做两件事:不是“废话”,而是我做了 我忘记在MATLAB中为java做的事情。其次,在创建JAXBElement时,如果我使用blah.getClass()而不是使用inner_class变量,它将不带任何限定条件地打印出来。我现在意识到这更像是一个拼凑问题,而不是一个QNa

  • 我在我的Jersey(2.7)项目中使用Moxy,基本上只是为了在服务发出响应时将我的对象整理为JSON。它工作得很好,但现在我也在使用ContainerResponseFilter对发出的每个响应进行一些更改,我不确定如何将请求体的内容解组到一个对象中,这是我需要的。 但我不确定是否有可能将它自动转换为一个对象。我需要的信息比较简单,所以我想我可以用另一种方式解析JSON,但我很好奇。 我试过找

  • 我目前正在尝试使用Glassfish 4(使用Jersery 2.0和EclipseLink 2.5)解构通过REST PUT提供的JSON对象。 JSON对象由多个属性组成,包括映射到Java枚举的字符串值。 除了有效负载中提供了无效的枚举值外,其他一切都正常工作 JSON对象: 被解组为: 如果JSON负载中的值不是有效的Rating,它当前返回null,这似乎是JAXB忽略转换错误的结果(请