使用JAXB来支持具有微小变化的模式

情况 我需要支持基于模式生成XML文档,这些模式之间只是略有不同。 具体来说,我需要支持的模式基于行业标准,这些标准随着时间的推移会略有变化,供应商可能会制作自己的定制版本。 问题 我打算使用inheritance的JAXB 2(来自Metro)作为解决方案。 我期望包结构最终会像这样: com.company.xml.schema.v1 com.company.xml.schema.v2 com.company.xml.schema.v2.vendorxyz v2包中的类只是扩展v1包中的类并根据需要覆盖。 不幸的是,该计划最终变得不可能,因为子类不能覆盖父类中的注释( 参见此处 )。 例如,如果模式中的属性在版本之间重命名,则v2元素类必须完全重新实现该元素而不从v1inheritance。 据我所知,这让我只有两个选择 选项1 为每个模式类型创建“基础”包,使用@XmlAccessorType(XmlAccessType.NONE)注释该包中的元素类,并删除所有其他注释。 然后,在每个版本化的包中创建类,这些类将“base”包中的相应类子类化,并添加所有必需的注释。 这个解决方案确实给了我一些inheritance领域的帮助,但代码重复是巨大的,维护是一个挑战。 选项2 不要使用JAXB。 我真的不喜欢这个解决方案,因为我也想使用JAX-RS / JAX-WS。 问题 我应该如何使用JAXB来支持具有微小变化的多个模式,而不需要一堆代码重复? 我应该看一下不同的技术组合吗? 编辑 Blaise下面的解决方案非常适用于我们的大部分模式,这些模式只是彼此之间的一个小翻译,通常具有相同的数据。 但是,如果将inheritance与包名称用于版本控制更有意义,我们遇到了一个问题。 例如: com.company.xml.schema.v1.ElementA com.company.xml.schema.v2.ElementA (其中v2.ElementA扩展v1.ElementA) 在这种情况下使用MOXy的OXM会遇到错误,可以在这里找到解决方法(使用Blaise提供的解决方案,不能少!)

设置/配置EJB Timer Service的DataSource

我正在尝试在我的应用程序中使用EJB 3.1中的Timer Service。 @Stateless @LocalBean public class StatelessTimerSessionBean { @Schedule(minute = “*”, second = “0”, dayOfMonth = “*”, month = “*”, year = “*”, hour = “9-17”, dayOfWeek = “Mon-Fri”) public void myTimer() { System.out.println(“Timer event: ” + new Date()); } } “..将EJB Timer Service的Timer DataSource设置设置为有效的JDBC资源..” 来自EJB计时器服务 我无法弄清楚如何正确配置Timer Datasource? 部署时出现的错误是: SEVERE: Exception while invoking class […]

为什么不捕获Exception catch RuntimeException?

这对我来说很奇怪。 RuntimeExceptioninheritance自Exception ,它inheritance自Throwable 。 catch(Exception exc) { /* won’t catch RuntimeException */ 但 catch(Throwable exc) { /* will catch RuntimeException */ 我知道RuntimeException是特殊的,因为它是未经检查的。 但据我所知,这仅适用于是否必须宣布例外,而不是它们是否被捕获。 即便如此,我也不知道为什么这个逻辑会在捕获Throwable时破坏。 这与我非常相关,因为我有一种情况,可以在终端操作中抛出RuntimeExceptions。 我不确定这个模式的名称,但是类似于我的类EmailRoller采用了一系列Callbacks 。 代码如下所示: for(Callback cb : callbacks) { try { cb.call(item); } catch(Exception exc) { logger.error(“Error in callback: “, exc); } } 所以这是一个像OOME这样的东西需要通过的情况,因为如果其中一个回调消耗所有的机器内存,那肯定会影响其他的运行。 但是NullPointerException ? 还是IndexOutOfBoundsException ? 这些会影响回调,但不会阻止其他人运行。 此外,这是一个企业设计。 不同的程序员或团队可以添加回调来处理项目,但它们应该彼此隔离。 […]

什么样的行为导致中断的exception?

我对Java中的线程相对较新,我注意到每次使用Thread.sleep()时我都要捕获InterrupetdException。 什么样的行为会导致这种情况,在我有监控线程的简单应用程序中,我可以忽略exception吗?

Java基础知识的澄清?

class test { test() { System.out.println(“Constructor”); } { System.out.println(“Hai”); } } public class sample { public static void main(String [] a) { test t = new test(); } } 在上面的代码中,为什么在执行构造函数之前,在大括号((即)“Hai”)中给出的语句是Printed。

带有2个事务管理器的@EnableTransactionManagement注释

我使用@Configuration注释来配置spring而不是xml文件。 我正在配置具有不同会话工厂和不同事务管理器的2个数据源。 我在这里@EnableTransactionManagement注释的问题。 我在其文档中读到, @EnableTransactionManagement更灵活; 它将回退到容器中任何PlatformTransactionManager bean的类型查找。 因此,名称可以是“txManager”,“transactionManager”或“tm”:它无关紧要。 这意味着我给方法的任何名称,它总是会搜索返回PlatformTransactionManager对象的方法,而我有2个transactionmanagers。 现在问题是,当我测试这个类时,它给了我错误: org.springframework.beans.factory.NoSuchBeanDefinitionException :没有定义[ org.springframework.transaction.PlatformTransactionManager ]类型的唯一bean:期望的单个bean但找到了2 我甚至试图拥有2个不同的配置类但是徒劳无功。 在xml配置中,情况并非如此。 我用两个标签注册了我的两个事务管理 ,它运行正常。 但是这里不能用注释做同样的事情。 如果我想在Spring注释配置类中配置2个具有2个不同事务管理器的数据源,我该怎么办?

Karaf / Maven – 无法解决:缺少要求osgi.wiring.package

我无法在Karaf(版本3.0.1)中启动捆绑包。 该捆绑包使用maven构建,并导入gson 。 我根据需要在maven中包含了gson: com.google.code.gson gson 2.3.1 构建顺利。 但是,在部署捆绑包时,我从Karaf收到此警告: 2015-05-27 12:45:07,371 | WARN | 49-19-bin/deploy | fileinstall | 11 – org.apache.felix.fileinstall – 3.2.8 | Error while starting bundle: file:/Users/user/Documents/tools/MyBundle-1.0.0-SNAPSHOT.jar org.osgi.framework.BundleException: Unresolved constraint in bundle MyBundle [121]: Unable to resolve 121.13: missing requirement [121.13] osgi.wiring.package; (&(osgi.wiring.package=com.google.gson)(version>=2.3.0)(!(version>=3.0.0))) at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974)[org.apache.felix.framework-4.2.1.jar:] at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)[org.apache.felix.framework-4.2.1.jar:] at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)[org.apache.felix.framework-4.2.1.jar:] at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1263)[11:org.apache.felix.fileinstall:3.2.8] at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1235)[11:org.apache.felix.fileinstall:3.2.8] […]

在WAR的WEB-INF / lib文件夹中重命名Maven依赖项

我需要在Maven生成的WAR的WEB-INF/lib文件夹中有一个JAR依赖项x-1.0.final.jar而不是x-1.0.jar ,它是它在存储库中的名称。 实现这一目标的最佳方法是什么? 在我的POM中,我有: foo x 1.0 我希望它以x-1.0.final.jar出现在WEB-INF/lib文件夹中。 这是对Maven Central的外部依赖我无法控制。 此外,我不想强​​迫所有人使用它将依赖项重新部署到其本地存储库。 是否有我可以使用的Maven插件或者我应该开始编写自己的插件?

Java以指数表示法解析数字

我试图将String转换为整数,我得到一个NumberFormatException 。 原因很明显。 但我需要一个解决方法。 以下是示例代码。 public class NumberFormatTest { public static void main(String[] args) { String num = “9.18E+09”; try{ long val = Long.valueOf(num); }catch(NumberFormatException ne){ //Try to convert the value to 9180000000 here } } } 我需要评论部分中的逻辑,通用的一个会很好。 谢谢。

关于平等的最佳做法:过载还是不过载?

请考虑以下代码段: import java.util.*; public class EqualsOverload { public static void main(String[] args) { class Thing { final int x; Thing(int x) { this.x = x; } public int hashCode() { return x; } public boolean equals(Thing other) { return this.x == other.x; } } List myThings = Arrays.asList(new Thing(42)); System.out.println(myThings.contains(new Thing(42))); // prints “false” } […]