Tag: jaxb

JAXB编辑列表getter?

我有XSD文件forms的数据模型,然后使用命令行从xjc生成相应的Java文件。 当我从XSD生成JAXB类时, List类型元素获取为它们生成的getter方法(没有相应的setter方法),如下所示: public List getElement3() { if (element3 == null) { element3 = new ArrayList(); } return this.element3; } 我在从List类型的XSD生成的几乎每个文件中都有很多字段。 使用案例: 现在,我不希望使用null检查生成getter。 我的应用程序代码具有逻辑,其中每个字段的getter经常被调用,这导致它们初始化为空 List 。 然后在编组时我必须停止空列表以传递有效负载,以避免通过线路发送大量空列表。 PS:我有一个用户明确设置Empty List的用例,服务器必须删除后端的某些项目。 因此,区分值是由用户显式设置还是仅因为在访问字段期间调用List的getter而设置。 那么,如何让JAXB生成一个没有null检查的getter? 因为在编译之后编辑生成的java文件会很麻烦,因为它存在于很多文件中,我们有XSD版本需要更新,每次新版本出现时都必须执行编辑。

为什么JAXB generateElementProperty = false没有达到预期的效果?

我正在使用以下绑定文件运行wsimport任务: 但是,这会导致使用JAXBElement而不是String ,如下面的getUserSummaryOrTypeOrLogLevel()所示 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = “ConfigSLMAction”, propOrder = { “userSummaryOrTypeOrLogLevel” }) public class ConfigSLMAction extends ConfigConfigBase { @XmlElementRefs({ @XmlElementRef(name = “UserSummary”, type = JAXBElement.class, required = false), @XmlElementRef(name = “LogLevel”, type = JAXBElement.class, required = false), @XmlElementRef(name = “Type”, type = JAXBElement.class, required = false) }) protected List<JAXBElement> userSummaryOrTypeOrLogLevel; @XmlAttribute(name = “name”) protected String […]

JAXB XML Adapters通过注释工作,但不通过setAdapter工作

我理解如何使用XMLAdapter 转换不可映射的类型 ,或者仅仅更改某些对象如何序列化/反序列化为XML。 如果我使用注释(包级别或其他),一切都很好。 问题是我试图改变第三方对象的表示,我无法将源代码更改为(即为了注入注释)。 考虑到Marshaller对象有一个手动添加适配器的方法,这应该不是问题。 不幸的是,无论我做什么,我都无法通过这种方式设置适配器来“启动”。 例如,我有一个表示XYZ空间中的点的类(地心坐标)。 在我生成的XML中,我希望将其转换为lat / long / altitude(大地坐标)。 这是我的课程: 地心 package testJaxb; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class GeocentricCoordinate { // Units are in meters; see http://en.wikipedia.org/wiki/Geocentric_coordinates private double x; private double y; private double z; @XmlAttribute public double getX() { return x; } public void setX(double x) { […]

JAXB对象 – 哈希码和等号

我们有一个巨大的Java应用程序,完全基于JAXB序列化。中间件服务器完成所有数据库访问并发送JAXB对象中的所有数据对象并序列化为XML并将数据发送到UI(C#.Net)。 数据从db访问到JAXB java对象的大部分时间后,我将不得不进行一些处理,比如“根据属性对对象集合进行排序”,找到avg,对对象列表进行一些计算。收集等 我的主要问题是,JAXB对象没有equals和hashcode。 所以我正在做的是将所有数据移动到一些用户定义的数据对象,其中我有hashcode,equals,compareTo定义,所以我可以在集合中执行所有操作,然后复制到JAXB对象。 我认为这是一个额外的开销。 问题: 1)jaxb对象是否支持equals / hashcode / compareTo – 我可以在模式中指定这些吗? 2)还有其他更好的选择吗? 谢谢。

JAXB以不同的方式将XML封送到OutputStream和StringWriter

我很抱歉,如果这已经得到解答,但我一直在使用的搜索术语(即JAXB @XmlAttribute压缩或JAXB XML编组到String不同的结果 )没有提出任何建议。 我正在使用JAXB取消/编组使用@XmlElement和@XmlAttribute注释注释的对象。 我有一个格式化程序类,它提供了两个方法 – 一个包装marshal方法并接受对象编组和一个OutputStream ,另一个只接受对象并将XML输出作为String返回。 不幸的是,这些方法不能为相同的对象提供相同的输出。 封送到文件时,内部标有@XmlAttribute简单对象字段打印为: 当编组到一个字符串时,它们是: 我更倾向于两种情况的第二种格式,但我很好奇如何控制差异,并且无论如何都会满足于它们。 我甚至创建了一个静态编组器,两种方法都使用它来消除不同的实例值。 格式代码如下: /** Marker interface for classes which are listed in jaxb.index */ public interface Marshalable {} /** Local exception class */ public class XMLMarshalException extends BaseException {} /** Class which un/marshals objects to XML */ public class XmlFormatter { private static […]

在具有JAXB的inheritance结构的xml之后进行解组

我想解组这个xml dir 2016-06-06 12:45 AM input.txt 123 file 2016-06-06 12:45 AM data.txt directory 这是我的class级结构 import java.util.ArrayList; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSeeAlso; @XmlRootElement @XmlSeeAlso({MessageResponse.class}) class Response { String command; public Response() { } @XmlElement public String getCommand() { return command; } public void setCommand(String command) { this.command = command; } } @XmlRootElement class […]

JAXB似乎正在重新编码新的行char

我有以下代码…… public static final String NEWLINE = String.format(“%n”); … StringBuilder b = new StringBuilder(); … b.append(NEWLINE); return b.toString(); 然而,当我在SOAPUI中运行它并查看RAW时,看起来它再次扩充它并且新行转为 而不是 1,name,value 2,name,value 它显示为…… 1,name,value 2,name,value 因此,当我使用正则表达式查询解析替换为空字符串时,全文仍然存在 现在我对编码并不熟悉,但这是SOAP消息的有效负载。 信封被剥离,并将其保存为CSV文件。 当我在Notepad ++中打开CSV时,新的行字符似乎可以工作,但该编码值仍然存在。 有谁知道我错过了什么? 我尝试添加一个(sb = Stringbuilder) sb.append(“”); 但这似乎不起作用,再次JAXB似乎逃脱了角色。 <![CDATA[000000,LK20130930120048,Compant,Data,20130930120048,, 000001,user,Fname,Mname,Lname,12345 Address 1,Address 2222,setAddress3,setCity,OH,US,44332,,N,N,E,,,,?,, 999999]]> 我也可以这样做,但我使用JAX-WS的默认marshaller。 所以我不确定在哪里放。

为什么wsimport在使用@XmlRootElement注释的服务器对象时遇到问题?

我正在服务器端使用JAX-WS完成Web服务的工作。 在许多域对象中,我使用@XmlRootElement来帮助促进使用JAXB将XML文件解组到服务中。 一切顺利,输出就是我期望看到的使用SoapUI。 但是,当我使用wsimport创建客户端时(作为其他开发人员的便利DAO),我开始在客户端集成测试类中遇到NullPointerExceptions。 对Web服务的调用工作正常,客户端收到响应,但我的更复杂的对象为空。 简单的属性,如字符串,返回了大量可用数据,但不是更大的对象。 通过使用简单的字符串重新创建服务并迁移到更复杂的对象的迭代,我发现当客户端收到使用@XmlRootElement在服务器上@XmlRootElement的对象时,这些是null的对象。 如果服务器对象没有@XmlRootElement注释,则客户端会收到所有复杂荣耀中的所有数据。 最初缺少@XmlRootElement让我适合解组服务器上的数据,但这个答案帮助了我。 因此,由于@XmlRootElement注释(在服务器上!),wsimport客户端因为解组Web服务响应而无声地失败的现象让我担心。 在这种情况下,我控制了双方,并可以做些什么。 但是,如果我无法控制服务器怎么办? 我将如何使用wsimport生成的代码解决这个问题?

如何让Ant在javac中使用JAXB 2.2.x而不是Java 6 SE JAXB类?

我正在更新遗留应用程序以使用Java 6 SE而不是Java 5 SE。 该应用程序使用JAXB,在Java 5 SE下,它在类路径上有JAXB参考实现jar。 当我转到Java 6 SE(更新38)时,我遇到了一些问题 (参见链接的Stackoverflow问题 ),我在一些帮助下解决了这个问题 。 因此,导致问题的下一件事是项目Ant构建脚本。 当Ant编译任务执行时,它会获取Java 6 SE附带的JAXB的嵌入式版本,而不是我在类路径中包含的jar版本(JAXB 2.2.6版本)。 我相信Java 6 SE包含JAXB 2.1.x. 这导致编译时错误,如下所示: [javac] location: @interface javax.xml.bind.annotation.XmlElementRef [javac] @XmlElementRef(name = “abbrev”, type = JAXBElement.class, required = false) 在这种情况下,JAXB 2.1.x中的@XmlElementRef不存在’required’属性,但它在2.2.x中存在。 如何更改我的Ant构建脚本,以便从构建类路径中获取JAXB 2.2.6 jar而不是Java 6 SE JDK中包含的类? 更新:解决方案基于彼得的答案

使用JAXB进行XML解组

我有一个XML文件,我试图解组,但我无法弄清楚如何做到这一点。 XML看起来像 draft Serial amt Amount http somehost.com/asdf 当我将params作为根元素并且没有服务器元素或配置为根元素时,我以前可以解组。 我添加了一个配置类来尝试取消编组,但我不知道我哪里出错了。 我的课看起来像 @XmlRootElement public class Config { private Params params = new Params(); @XmlElement(name=”params”) public Params getParams() { return params; } public void setParam(Params params) { this.params = params; } } public class Params { private List params = new ArrayList(); public List getParam() { return […]