Tag: jaxb

对象到XML,向后和向前兼容性

我正在一个应用程序中工作,我们需要以XML格式保存对象,并在需要时稍后加载它们。 为此,我使用JAXB来编组和解组XML到Java类。 我的问题是我必须在某个时候更改Java模型(通过添加,重命名或删除属性),因此,我将拥有不兼容的已保存的XML,这些XML无法绑定到新的类表单。 为了解决这个问题,每次我必须进行更改时,我会在新软件包(以其版本命名)下获取所有类的副本并应用所请求的更改。 在保存XML时,我保存了它的版本,以便我可以决定JAXB应该扫描哪个包来解组这个XML。 我的问题是,有没有其他方法可以使用JAXB实现向后和向前兼容性? 如果没有,是否有任何其他技术可以支持这个?

向模式生成的JAXB类添加额外的方法

这是我的XSD文件的一个简单摘录 我使用maven-jaxb2-plugin从中生成Java类。 Document类有一个getTitle()方法来返回title属性的文本。 我想为Document添加一个额外的方法: public String getStrippedTitle() { return getTitle().replaceAll(“\\s+”, “”); } 我希望我的额外方法出现在unmarshalled对象上(而不是我只是调用它或编写一个包装类)因为我想将顶级unmarshalled对象传递给一个字符串模板并让它迭代调用我的子元素额外的方法。 我找到了说明,但是他们告诉我在Unmarshaller上设置一个属性,而我的(Mac OS X,Java 7)实现似乎不支持任何属性。 我该怎么做?

JAXB应该从`beforeMarshal(Marshaller)方法返回什么?

首先,我不是在谈论Marshaller#Listener 。 我在谈论那些class defined事件回调。 任何人都可以告诉我应该从boolean beforeMarshal(Marshaller)方法返回什么? /** * Where is apidocs for this method? * What should I return for this? */ boolean beforeMarshal(Marshaller marshaller); 无论如何,我的意思是使用此方法将JPA’s Long @Id to JAXB’s String @XmlID转换JPA’s Long @Id to JAXB’s String @XmlID 使用JAXB-RI并且不使用MOXy 。 [编辑]一个void版本似乎工作。 这只是一个文档问题吗?

无论如何将构造函数参数传递给JAXB适配器?

我在我写的WebService中使用Spring 3 IOC和JAXB / JAX-WS。 我现在有一个小问题,数据必须在返回消费者之前进行舍入,因为它们无法处理值的完整精度。 为了最小化对WS设计和计算的影响,我选择使用Jaxb XmlAdapter在编组响应时对值进行舍入。 一切正常。 我现在的问题是我想让它变得灵活。 即:在某些情况下,我需要舍入到2个小数位,大约4个等等。现在,我必须创建一个TwoDecimalAdapter和一个FourDecimalAdapter,并在模型定义中使用必要的相应位置。 这意味着代码重复。 反正有没有创建一个通用的Rounding Adapter,并传递一个参数给它? 例如,而不是: @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=FourDecimalRoundingAdapter.class,type=java.math.BigDecimal.class) 我希望能够做到这样的事情: @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=new RoundingAdapter(4),type=java.math.BigDecimal.class) 显然,这不起作用,因为JAXB实例化适配器本身,但是有什么技术可以用来将参数传递给适配器吗? 我希望能够在Spring中声明舍入适配器并以这种方式使用它,但又一次,我无法设计一个可重用的解决方案。 谢谢, 埃里克

Unmarshall期间无效的XML字符

我使用编码“UTF-8”将对象编组到XML文件。 它成功生成文件。 但是当我试图将其解组时,会出现错误: 在属性“{1}”的值中找到无效的XML字符(Unicode:0x {2}),元素为“0” 字符为0x1A或\ u001a,在UTF-8中有效,但在XML中是非法的。 JAXB中的Marshaller允许将此字符写入XML文件,但Unmarshaller无法解析它。 我试图使用另一种编码(UTF-16,ASCII等)但仍然出错。 常见的解决方案是在XML解析之前删除/替换此无效字符。 但是,如果我们需要这个角色,如何在解组之后获得原始角色? 在寻找此解决方案时,我想在解组之前用替换字符(例如dot =“。”)替换无效字符。 我创建了这个类: public class InvalidXMLCharacterFilterReader extends FilterReader { public static final char substitute = ‘.’; public InvalidXMLCharacterFilterReader(Reader in) { super(in); } @Override public int read(char[] cbuf, int off, int len) throws IOException { int read = super.read(cbuf, off, len); if (read == -1) […]

使用CXF和wsdl2java生成代码时解决冲突

我在使用wsdl2java通过与Maven的cxf-codegen-plugin的一堆WSDL文件生成代码时遇到了一些冲突。 WSDL声明了同一系统的不同API,并且生成的代码有一些重叠(特别是对于模型类)。 外部系统和WSDL来自第三方,因此不受我们控制。 我遇到的第一个问题是由一个WSDL引起的一个结果ObjectFactory类中的命名冲突。 它定义了一个名为Foo的complexType,它包含一个名为Status的元素,它还定义了一个名为FooStatus的元素。 生成代码时,JAXB会抛出一个拟合,因为ObjectFactory将有两个名为createFooStatus(…)工厂方法,并且在运行时期间最终会出现exception。 我试过向-autoNameResolution提供选项-autoNameResolution但没有用。 我看过“两个声明导致ObjectFactory类中的冲突”和“将外部JAXB绑定文件应用于从WSDL导入的模式元素” ,并基于那些我编写的外部绑定文件重命名其中一个工厂方法。 我在绑定文件中使用SCD而不是XPath,如后一个链接所示,因为我和XPath的问题与作者有同样的问题。 这是有效的,但前提是我单独处理WSDL文件并仅将绑定文件应用于导致冲突的WSDL。 Maven配置如下所示: org.apache.cxf cxf-codegen-plugin 3.0.0-milestone1 generate-proxies generate-sources ${basedir}/First.wsdl ${basedir}/bindings.xml ${basedir}/Second.wsdl ${basedir}/Third.wsdl … More wsdlOption declarations … wsdl2java 现在,如果我这样做,我最终会遇到另一个问题,因为来自不同WSDL文件的生成代码使用相同的包结构。 这在实践中意味着在处理后续WSDL文件时会覆盖ObjectFactory类,这意味着在插件执行之后只存在从最后一个WSDL生成的那个。 我知道我可以更改目标包结构,但是从不同的WSDL生成的代码有很多重叠,复制它会感觉很傻。 我也尝试使用-keep wsdl2java选项,但这似乎没有做任何事情(或者至少ObjectFactory类仍然被覆盖)。 我的理解是,对此的解决方案是使用像这样的Maven配置一次性处理所有WSDL(仅显示配置部分,其他所有部分保持不变): ${basedir}/bindings.xml ${basedir} *.wsdl 但是,这会导致com.sun.istack.SAXParseException2 ,说我的SCD表达式与任何架构组件都不匹配(因为架构组件仅存在于其中一个WSDL中)。 如果我修改WSDL文件本身并使用后面的Maven配置而没有绑定文件,我可以得到我想要的结果。 通过这样做,生成的ObjectFactory是在使用第一个Maven配置单独处理WSDL时创建的合并。 但是,我宁愿不这样做,而是想用外部绑定文件来管理它。 我该如何解决这个问题? 我是否可以编写/应用绑定文件,以便在找不到匹配的模式组件时不会引发exception? 或者我可以单独处理WSDL而不是覆盖ObjectFactory类吗? 或者,我是否只需要将其从不同的WSDL生成到不同的包或者自己编辑WSDL文件? 万一它很重要,我当前的绑定文件看起来像这样(WSDL位于我的项目内与绑定文件在同一目录中):

JAXB是否使用字节码检测?

我工作的人注意到(在堆栈跟踪中)当使用-javaagent运行jvm时:spring-instrumentation.jar我的JAXB注释类中有一些我们没有编写的奇怪的新方法:例如SomeJaxbAnnotatedClass $ JaxbAccessorM_getFields_setFields_java_util_Set.get 这是否意味着jaxb在可用时使用字节码检测? 我在哪里可以阅读有关此function的更多信息 谢谢,Yuval

导致SAXException2的原因:“com.foo.Bar”的实例替换为“java.lang.Object”,但“com.foo.Bar”绑定到匿名类型

将现有的jaxb(使用jaxb1.0.1和jaxb 2.0.5)应用程序(在带有jdk5的JBoss 4.3上)迁移到jaxb 2.1.10(随jdk6提供,更新jdk1.6.0_30)。 我无法修改客户提供的架构。 我已经从Sun RI删除了jaxws20,jwsdp,jaxp和jaxb jar的所有引用,并且仅使用jdk 6提供的jar。 任何指针? Caused by: com.sun.istack.SAXException2: Instance of “com.foo.Bar” is substituting “java.lang.Object”, but “com.foo.Bar” is bound to an anonymous type com.foo.Bar@a2e3ss at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:247) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:662) at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:165) at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152) at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:332) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:698) at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:152) at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:332) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:592) at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:320) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:493) at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:325)

Jersey / JAX-RS:在响应头中返回Content-Length而不是chunked transfer encoding

我使用Jersey创建RESTful API资源,使用ResponseBuilder生成响应。 RESTful资源的示例代码: public class infoResource{ @GET @Path(“service/{id}”) @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public Response getCompany(@PathParam(“id”)String id) { //company is just a POJO. Company company = getCompany(id); return Response.status(200).entity(company).build(); } } 在响应中,它在响应头中返回分块传输编码。 “Jersey world”中的正确方法是让它返回Content-Length标头而不是Transfer-Encoding: chunked响应头中的Transfer-Encoding: chunked标头?

JAXB使用JAX-WS绑定生成可序列化的类

拥有JAXB-RI和CXF。 WSDL首先。 我想要一个生成的类来实现Serializable 。 我现在有以下绑定xml,它工作(SEI类名称被更改) 不,在这种情况下,我应该添加的位置和内容。 我试过了: 和 标记内部和外部 – 未添加Serializable ,或者根本不生成类(没有任何错误)。 另见这个主题 那么,究竟如何做到这一点