Java对象转XmlObject后,validate方法对有效实例返回false求排查
问题描述
编写了一段将Java对象(UserAccount)转换为XmlObject的代码,但调用XmlObject的validate方法时始终返回false,请求排查问题。
代码片段
public void validate(UserAccount userAccountObject) throws SecurityServiceException, JAXBException, XmlException { JAXBContext jaxbContext = JAXBContext.newInstance(UserAccount.class); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter sw = new StringWriter(); JAXBElement<UserAccount> jaxbElement = new JAXBElement<>(new QName("", "userAccount"), UserAccount.class, userAccountObject); marshaller.marshal(jaxbElement, sw); String xmlString = sw.toString(); XmlObject xmlObject = XmlObject.Factory.parse(xmlString); if (!xmlObject.validate()) { logger.debug("Invalid XML Object."); throw new SecurityServiceException(MessageConstants.INVALID_XML_OBJECT); } }
生成的XML内容
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <userAccount xmlns:ns2="http://gnw.com/ebd/service/domain/"> <ns2:ApplicationName>"ABC_APPLICATION"</ns2:ApplicationName> <ns2:UserInfo> <ns2:UserId>"abc@gmail.com"</ns2:UserId> <ns2:FirstName>"First"</ns2:FirstName> <ns2:LastName>"Last"</ns2:LastName> <ns2:CompanyName>"DEF"</ns2:CompanyName> <ns2:Properties> <ns2:FieldName>"extend_validity_values"</ns2:FieldName> <ns2:FieldValue>"true"</ns2:FieldValue> </ns2:Properties> </ns2:UserInfo> <ns2:Password>"password"</ns2:Password>
排查出的问题及解决方法
XML结构不完整:生成的XML缺少根标签的闭合标签
</userAccount>,属于格式错误,直接导致校验失败。
解决:检查JAXB序列化过程是否完整,确认UserAccount对象的所有字段都被正确序列化,避免XML输出被截断。字段值包含多余双引号:所有元素的文本内容都被额外的双引号包裹(例如
"ABC_APPLICATION"),如果对应的XSD约束定义这些字段为普通字符串,带引号的内容会不符合校验规则。
解决:检查UserAccount对象的属性赋值逻辑,确保属性值本身不包含多余的双引号,比如将"ABC_APPLICATION"改为ABC_APPLICATION。未指定校验用的Schema:默认调用
xmlObject.validate()时如果没有加载对应的XSD文件,校验逻辑无法依据约束规则判断XML合法性,可能导致误判。
解决:加载对应的Schema文件并传入校验方法,示例代码如下:
// 加载XSD Schema XmlSchema schema = XmlSchema.Factory.parse(new File("path/to/userAccount.xsd")); XmlOptions validateOptions = new XmlOptions(); validateOptions.setLoadSchema(schema); // 使用Schema进行校验 if (!xmlObject.validate(validateOptions)) { logger.debug("Invalid XML Object."); throw new SecurityServiceException(MessageConstants.INVALID_XML_OBJECT); }
内容的提问来源于stack exchange,提问作者Ujjwal Sharma
相关产品推荐
相关产品推荐

