从xml动态生成Java bean类有什么好处?

如何解决从xml动态生成Java bean类有什么好处?

| 我已经使用IDE编写了许多Java Bean类。另一个人提出了另一种方法。他建议我将其中包含bean定义的xml文件放入其中。然后,我使用jaxb或xslt在构建期间动态生成类。尽管这是一种新颖而有趣的方法,但我认为它没有任何重大好处。 在这种建议的方法中,我仅看到一个好处:无需在配置控制中维护Java bean类。 Bean的任何更改都将仅需要xml文件中的更新。 动态生成Java类有什么主要好处?采取这种方法还有其他原因吗?     

解决方法

我在项目中使用了Jibx及其生成器。我的经历好坏参半。 http://static.springsource.org/spring-ws/site/reference/html/why-contract-first.html中提到了使用JAXB(XJC)生成器的通常情况。 与XML的相互转换使得可以将其存储在DB中并检索以供将来使用,以及用于功能测试的测试用例输入。 对于大型项目,使用任何类型的生成器(Jaxb,Jibx,XMLBeans,Custom)可能都是有意义的。它允许数据类型的标准化(如BigDecimal表示财务金额,如ArrayList表示所有列表),强制接口(如Serializable或Cloneable)。这样可以实施良好做法,并减少了对生成文件进行审阅的需要。 它允许通过XSLT注入代码或对生成的Java文件进行后期处理。示例是在setter方法内,针对FinancialAmount类型的每个字段,将舍入代码注入具有特定策略(UP,DOWN,NEAR)的特定十进制大小(2,6,9)。强迫这种行为确实减少了错误的发生(对于公司应承担的不正确的财务价值)。 缺点是 通常每个Java类只能是一个bean类。进行的任何自定义将被覆盖。由于(在我的情况下)生成器与构建过程相关联。这些类在每次构建时都会生成。 您不能在Bean类上实现自定义接口,也不能为自己或第三方框架添加注释。 由于通常会生成默认构造函数,因此无法像工厂方法那样轻松实现模式。重构通常很困难,因为生成器通常不支持重构。 您可能(现在不确定,Jibx在几年前是对的)在最适用的时候无法生成ENUMS。 无论如何,您可能无法使用自己的默认数据类型覆盖。 CopyOnWrite列表,而不是ArrayList,用于跨线程共享的变量或List的自定义实现(也实现Observer模式)。 生成器的好处超过了大型项目(在人与地而不是代码,认为在三个地方有150个开发人员)分布式项目的成本。您可以通过定义包含Bean的自定义类来解决这些缺点,并使用XSD批注或另一个配置文件中的更多元数据来实现行为或后处理(添加其他代码)。请记住,由于整个项目都取决于发电机,因此发电机的支持和维护变得至关重要。小心使用它。 对于较小型的项目,我个人会自己编写类。对于大型项目,由于缺乏重构支持,我个人不会在中间层使用它。它可以用于要绑定到UI框架的简单bean。     ,我同意@Akhilss。我的经验是在大型Java EE项目中进行代码生成的。 这完全取决于您的项目。如果您仅在编写几个Bean,并且仅需要基本功能,那么我认为不需要以XML开头(无论如何,这经常被过度使用)。特别是如果您实际上也不需要XML。 但是,如果要构建一个需要XML的系统(例如SOAP Web服务WSDL和模式),那么生成是个好主意,因为它使您不必手动保持模式和Bean同步。以及提供工厂类和其他支持代码。 作为反驳,使用EJB3和类似的标准,现在通常更容易编写bean并即时生成混乱的XML内容。就是让服务器完成繁重的工作。 考虑代码生成的另一个原因是,您是否需要在bean中使用更复杂的功能,因为它们代表数据结构。几年前,我试用了Apache Tuscany项目,以从XML生成SDO bean。这样做的好处是,我可以生成诸如属性更改通知之类的功能,因此当我修改Bean的任何属性(包括集合)时,可以自动通知程序的其他部分。这样生成的功能可以在您需要时节省大量时间和金钱。 最终,我建议您遵循KISS原则。因此,请勿添加不需要的内容。从XML生成的代码从长远来看对您有帮助。但是,像任何技术一样,请确保出于正确的原因添加了它。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-