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

将使用JAXB处理JSON的问题放到Jersey 2.2和MOXy下

朱丰
2023-03-14

我已经在这个问题上纠缠了好几天,现在正在寻找一些指导来帮助解决这个问题。我在Metro下使用jax ws有着丰富的经验,但这是我第一次使用Jersey进入jax rs。为了简化运动部件,我以moxy代码为起点。

我修改了示例项目以接受XML和JSON。我以为这很简单,但我似乎错过了一些东西,因为这是一次痛苦的经历。当我请求“application/xml”时,代码运行没有问题,GET将用于“application/json”,但当我尝试使用json执行PUT时,服务器返回500状态代码。我可以看到PUT请求中发送了JSON,但服务器似乎在接受JSON时遇到了问题。

这是修改后的CustomerResource。java文件段。我所做的就是添加MediaType。应用程序的JSON参数生成并使用注释。

@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。在单独测试中请求XML和JSON媒体类型的java文件:

@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);
}

在App.java文件中,我添加了JsonMoxyConfigurationContextResolver类和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;
    }
}

以下是显示“application/xml”放置成功的日志段,状态为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。Grizzly测试容器没有生成捕获任何异常信息的日志,并且看起来在500响应中没有返回任何内容。有没有办法获取额外的异常详细信息?

对如何进行有何建议?

非常感谢。

共有1个答案

吕越彬
2023-03-14

实际上,造成这一问题的原因是:

  • @XmlPathCustomerbean和

这会导致在(取消)编组JSON期间出现NullPointerException。MOXy的夜间版本(2.5.12.6.1)对此进行了修复。您可以从夜间构建页面下载它。

如果您现在不想更改MOXy的版本,只需删除这一行即可

configuration.setNamespacePrefixMapper(namespacePrefixMapper);

JsonMoxyConfigurationContextResolver中,您应该很好。

关于日志问题-我们知道它和它的存在固定(应在泽西2.3中解决)。

 类似资料:
  • 我扩展了moxy代码以使用XML模式定义,而不是JAXB注释bean。xjc编译的XML模式生成与原始示例相同的XML和JSON编码。 我按照jersey的说明,使用ObjectFactory在CustomerResource中生成JAXBElement客户对象表示。JAVA我还按照描述修改了客户机。我还将Jersey 2.2下的JAXB与MOXy结合在一起,解决了PUT问题中描述的JSON处理问

  • 问题内容: 在过去的几天中,我尝试使用MOXy JAXB支持对Hibernate模型的XML编组/解组。尝试执行此操作时,我遇到了hibernate代理对象的问题。考虑类似: 我尝试通过以下方式使用MOXy JAXB映射此代码: 我的问题是,hibernate实例化了通过在User上调用getAddress()获得的地址的代理对象。然后,当JAXB尝试封送对象时,它无法发现它实际上是它要封送的Co

  • 我正在尝试使用MOXY的XML元数据扩展映射下面的接口。但当我尝试加载它时,我得到以下错误。我不能将公共构造函数添加到中,因为它是枚举。 我的问题是:为什么Moxy impl在xml元数据中没有指定?

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

  • 现在我有了这堂课: 并且我有: 如果运行此代码,将得到: 我该怎么解决这个? 我搜索了SO和Google,这些答案都不起作用: 使用Eclipselink.media-type值设置封送器属性时的PropertyException:Application/JSON JAXB javax.xml.bind.PropertyException

  • 有人帮忙吗? 提前道谢。