在JEE Restfull网络服务和Android之间使用相同的API解析数据的最佳方法是什么?

时间:2019-02-20 16:06:36

标签: java android java-ee jackson jaxb

我们有一个大型项目,由JEE模块,JAVA客户端应用程序,Android应用程序和其他自制的Java项目组成。

由于项目的多样性,我们决定制作JEE,Java客户端应用程序和Android应用程序通用的Java库项目和Java实体项目,以限制项目之间的代码冗余。

开始时,我们在JEE服务器端只有Java客户端和Restfull Web服务,它们使用JAXB XML Binding API交换数据。因此,很容易在实体项目中的类上使用JAXB批注(该批注设置为对Java Client项目和JEE项目的依赖)。双方都可以使用相同的注释轻松地对XML数据进行编码和解码。

现在我们有了一个Android应用程序,我想使用相同的方式来交换数据。事实是,JAXB在Android上已“贬值”。因此,我在Jackson图书馆中发现,有一个JaxbAnnotation参数用于获取与JAXB绑定的数据,但是我对解决方案的完全兼容性不满意。

我也尝试过使用JSON绑定,因为我看到JSON-B将成为JavaEE 8中的标准,但是似乎它需要JavaEE API类,并且我认为将其添加到Android项目中并不是一件好事。

所以我的问题是:使用相同的实体依赖关系(和相同的解析API)并限制实体对象的XML或JSON绑定注释,在JEE Restfull Web服务和Android应用程序之间交换数据的最佳实践是什么?

我希望您能很好地理解问题。

谢谢。

1 个答案:

答案 0 :(得分:0)

将您的实体项目命名为entities-module。该项目包含POJO个类,这些类带有JAXB注释,例如:@XmlElement@XmlType等。由于就像您所写的那样,“ JAXB在' Android ”,您需要选择以下选项:通过其他工具阅读JAXB批注或创建新的自定义POJO结构。

通过其他工具阅读JAXB批注

Jackson库对JAXB注释具有良好的支持。您需要做的就是使用jackson-module-jaxb-annotations模块。这很容易注册,如果您已经使用Jackson进行JSON的序列化/反序列化,这是显而易见的选择。该怎么做,您可以在Using JAXB with Google Android上找到有关此问题的阅读答案。
优点:

  • 您不需要创建新的POJO架构。
  • 如果Restful API中有更改,请使用entities-module项目的下一个版本。

缺点:

  • JAXB上启用 Android的问题。
  • 与沉重的JAXBJackson模块层有关的性能问题。

新模块

第二种选择是使用POJO创建新模块,并使用更快更小的库,例如SimpleXML
优点:

  • 更好的表现
  • 使用降级的JAXB类构建应用程序没有问题。
  • 您可以优化结构:忽略未使用的字段,选择更好的类型,等等。

缺点:

  • 您需要使用新的类结构创建新模块。
  • 学习和维护新图书馆
  • 如果API中有更改,则需要在几个模块中重复更改。

您需要查看pros and cons列表上方的内容,然后确定最适合您的内容。

我还要添加两个选项:

  1. JAXB注释替换为Jackson注释。 Jackson确实具有很好的XML支持,同时也为JSON提供了出色的支持。它将为您轻松支持JSON中的XMLAPI格式。另外,您可以在Jackson上使用Android库。
  2. Android应用创建新的JSON API。通常,UI应用上的Android流与Web App上的流不同,并且您可能最终还是会想到这个想法。