Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 转化头痛_Java_Xml_Jpa_Jaxb_Schema - Fatal编程技术网

Java 转化头痛

Java 转化头痛,java,xml,jpa,jaxb,schema,Java,Xml,Jpa,Jaxb,Schema,我正在处理将XML节点转换为JPA实体的任务。XML中的对象与实体表示的对象相似,但并不完全相同。看来在我前面会有很多转换代码 XML在Schema.xsd文件中定义,我使用JAXB生成类并创建实例。上面的决定是不接触生成的类型。我将为它们中的每一个创建转换器,也许我会使用访问者模式,我还不知道 困扰我的是,有人决定更改.xsd文件,而不更新负责的转换器 我的想法是让这些转换器类维护代码中处理的相应JAXB类的字段的静态最终列表。如果有人在.xsd文件中修改它们,将会记录一些警告,说明某些字段尚

我正在处理将XML节点转换为JPA实体的任务。XML中的对象与实体表示的对象相似,但并不完全相同。看来在我前面会有很多转换代码

XML在Schema.xsd文件中定义,我使用JAXB生成类并创建实例。上面的决定是不接触生成的类型。我将为它们中的每一个创建转换器,也许我会使用访问者模式,我还不知道

困扰我的是,有人决定更改.xsd文件,而不更新负责的转换器

我的想法是让这些转换器类维护代码中处理的相应JAXB类的字段的静态最终列表。如果有人在.xsd文件中修改它们,将会记录一些警告,说明某些字段尚未处理,或者某些已处理字段不再存在

此外,我希望确保转换器的数量与JAXB生成的类的数量相匹配怎么做?

也许我应该在执行时检查一下可以从.xsd文件生成哪些类,并将它们与注册的转换器进行比较。我觉得我不能只是扫描特定包中的类来检查JAXB输出类


也许访问者模式可以告诉我出了什么问题,但延长检查时间,直到XML-JPA转换中的错误在实践中发生,可能是个坏主意。

如果我做对了,你想用JAXB注释、xsd文件和创建映射器XML实体对实体进行注释,对吗?或者xml和实体之间存在某种DTO

我认为您可以尝试在构建期间从Java类创建xsd文件。 然后可以使用JAXB marshaller进行xml->Java类转换。 如果您仍然需要知道转换的数量是否与Java类的数量匹配,那么我将为此创建集成测试。例如,我需要保持一些命名约定: MyEntity,MyEntityMapper 然后测试将遍历实体(DTO?)并搜索映射器


但可能我没有正确理解您的问题,请提供更多详细信息。

如果您在构建过程中生成类,那么如果有人更改了XSD文件,编译就会失败,对于未处理的字段,应该通知能够实现缺少的字段的人。没有简单的解决办法。他们应该通知,但你永远不知道他们是否会。。。虽然,这些预防措施可能确实花费了我太多的时间,但如果你想让你的XSD独立于你的目标Java类发展,我建议不要使用JAXB。相反,您可以让转换器使用XPath表达式从已知位置的XML文件中提取数据。如果模式更改,某些路径可能不再有效,但XPath不会崩溃,您可以记录一些警告消息。只要您正确生成JAXB类,它就会生成编译时错误,对于其他人,您应该编写测试用例或某种类型的代码来验证XSD和实体类,我对它们没有权限。我只能翻译,必须是“手动”翻译。无法将xml直接转换为实体。没有生成xsd。由于这一点,您可以保持实体不受JAXB注释的影响。所以我想我应该使用JAXB marshaller来处理xml DTO,并为DTO实体创建映射器。仍然集成测试,以确保映射器的存在。你认为呢?是的,我想做测试,但我需要确定处理类的完整列表。它们是在构建时生成的。我想我需要更深入地了解JAXB,以便自己从.xsd文件中获取该列表。好吧,我认为您可以访问生成的类并将它们与映射器进行比较。您的意思是作为文件访问它们?我没有想到,也许这会是一个解决办法。