- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 JAXB 不太熟悉,但这是我所掌握的上下文,请阅读所有内容以理解。
1. 我正在执行以下操作以使用 JAXB 从此 XML 获取值...
XML 文档片段(原始):
<Request deploymentMode="production">
<OrderRequest>
<OrderRequestHeader orderID="12345" orderDate="2012-07-04" type="new">
<Total>
<Money currency="USD">200.0</Money>
</Total>
<ShipTo>
<Address>
<Name xml:lang="">Test</Name>
<PostalAddress name="default">
<DeliverTo/>
<Street>Value 1</Street>
<City>Value 2</City>
<State>Value 3</State>
<PostalCode>302010</PostalCode>
<Country isoCountryCode="US">USA</Country>
</PostalAddress>
</Address>
</ShipTo>
因此,我想要的值是来自 PostalAddress
的 State
,我使用以下代码:
String state = xml.getRequest().getOrderRequest().getOrderRequestHeader().getShipTo().getAddress().getPostalAddress().getState();
//This will return "Value 3"
一切都很好。
2. 问题从此时开始,我将执行与上面相同的操作,但现在使用此 XML...
XML 文档片段(其他):
<Request deploymentMode="production">
<OrderRequest>
<OrderRequestHeader orderID="12345" orderDate="2012-07-04" type="new">
<Total>
<Money currency="USD">200.0</Money>
</Total>
<ShipTo>
<Address>
<Name xml:lang="">Test</Name>
</Address>
</ShipTo>
好吧,我知道该值不存在,但我不想对我的代码进行任何更改并仍然使用它:
String state = xml.getRequest().getOrderRequest().getOrderRequestHeader().getShipTo().getAddress().getPostalAddress().getState();
上面的代码将产生一个NullPointerException
并停止进程。我需要的不是停止该过程,因为这不是我从 XML 中提取的唯一值(这只是我正在处理的一个示例)。因此,如果找不到该值,那么我希望我的 state
变量自动为 null
。
问:有没有办法不产生异常并使我的字符串变量state
只是null
(如果值可以)找不到?
PS。一个可能的解决方案是执行以下操作:
//Fill the entity
PostalAddressType p = xml.getRequest().getOrderRequest().getOrderRequestHeader().getShipTo().getAddress().getPostalAddress();
//Variable for state
String state = null;
//Evaluate if it is null or not
if(p != null)
//Capture the value if not null
state = p.getState();
但我不喜欢为 XML 的每个实体创建 if
语句。正如我所说,我希望在不修改代码的情况下实现自动化,并且我不知道是否有一些 JAXB 配置或为此执行的操作。
提前致谢。
最佳答案
JAXB (JSR-222)是用于将对象与 XML 相互转换的 Java 标准。有多种开源实现。 JAXB 使用的对象是 POJO(普通旧 Java 对象)。这些类中没有嵌入任何类型的 XML 逻辑。由于 JAXB 设计为与现有类一起使用,因此可能可以制定一些逻辑来支持您的用例。以下是几个选项。
选项 #1 - 延迟加载 PostalAddress 属性(不推荐)
地址
如果属性为 null
,您可以向 getPostalAddress()
方法添加逻辑来实例化 PostalAddress
的实例。
package forum11333165;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Address")
public class Address {
private String name;
private PostalAddress postalAddress;
@XmlElement(name="Name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(name="PostalAddress")
public PostalAddress getPostalAddress() {
if(null == postalAddress) {
postalAddress = new PostalAddress();
}
return postalAddress;
}
public void setPostalAddress(PostalAddress postalAddress) {
this.postalAddress = postalAddress;
}
}
邮政地址
package forum11333165;
import javax.xml.bind.annotation.XmlElement;
public class PostalAddress {
private String state;
@XmlElement(name="State")
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
演示
下面的演示代码演示了您将能够
package forum11333165;
import java.io.StringReader;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Address.class);
StringReader xml = new StringReader("<Address><Name>Test</Name></Address>");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Address address = (Address) unmarshaller.unmarshal(xml);
System.out.println(address.getPostalAddress().getState());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(address, System.out);
}
}
输出
下面是运行演示代码的输出。正如您所看到的,我们得到了我们正在寻找的 null
值,但输出包含额外的 PostalAddress
方法。
null
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Address>
<Name>Test</Name>
<PostalAddress/>
</Address>
选项 #2 - 如果属性为 Null,则返回新实例(不推荐)
地址
package forum11333165;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Address")
@XmlAccessorType(XmlAccessType.FIELD)
public class Address {
@XmlElement(name="Name")
private String name;
@XmlElement(name="PostalAddress")
private PostalAddress postalAddress;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PostalAddress getPostalAddress() {
if(null == postalAddress) {
return new PostalAddress();
}
return postalAddress;
}
public void setPostalAddress(PostalAddress postalAddress) {
this.postalAddress = postalAddress;
}
}
输出
我们可以使用与上一个选项相同的演示代码来生成新的输出。 get 仍然有效,并且我们没有获得额外的 PostalAddress
方法。不利的一面是我们认为我们设置的状态没有被捕获。
null
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Address>
<Name>Test</Name>
</Address>
选项 #3 - 在调用 Get On It 之前检查值不为 Null
此选项需要做更多工作,但最终将使您的应用程序更易于维护。
关于java - 无法对 JAXB 生成的模型中的 null 值调用 "get",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11333165/
最近开始学习oracle和sql。 在学习的过程中,我遇到了几个问题,我的 friend 在接受采访时被问到这些问题。 SELECT * FROM Employees WHERE NULL IS N
这个问题在这里已经有了答案: Can we subtract NULL pointers? (4 个回答) 关闭 2 个月前。 是否定义了NULL - NULL? (char *)NULL - (ch
是否有推荐的方法(根据 .net Framework 指南)检查 null,例如: if (value == null) {//code1} else {//code2} 或 if (value !=
我正在尝试将值插入数据库,但出现这样的错误任何人都可以告诉我为什么该值为空,如下所示: An exception occurred while executing 'INSERT INTO perso
这个问题在这里已经有了答案: String concatenation with a null seems to nullify the entire string - is that desire
您好,我正在 Android 联系人搜索模块中工作。我正在查询下方运行。 cur = context.getContentResolver().query(ContactsContract.Data.
下面的 SQL 表定义说明了从我的 MYSQL 数据库创建表的语句之一,该数据库是由我公司的前开发人员开发的。 DROP TABLE IF EXISTS `classifieds`.`category
我主要有应用程序开发背景。在编程语言中 variable == null或 variable != null有效。 当涉及到 SQL 时,以下查询不会给出任何语法错误,但也不会返回正确的结果。 sel
我在尝试检查某些元素是否为 NULL 时遇到段错误或不。任何人都可以帮忙吗? void addEdge(int i, int j) { if (i >= 0 && j > 0)
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
下面查询的关系代数表达式是什么?我找不到“Is Null”的表达式。 SELECT reader.name FROM reader LEFT JOIN book_borrow ON reader.ca
我正在尝试使用三元运算符来检查值是否为 null 并返回一个表达式或另一个。将此合并到 LINQ 表达式时,我遇到的是 LINQ 表达式的 Transact-SQL 转换试图执行“column = n
我在给定的代码中看到了以下行: select(0, (fd_set *) NULL, (fd_set *) NULL, (fd_set *) NULL, &timeout); http://linux
var re = /null/g; re.test('null null'); //> true re.test('null null'); //> true re.test('null null')
这个问题在这里已经有了答案: 关闭 13 年前。 我今天避开了一场关于数据库中空值的激烈辩论。 我的观点是 null 是未指定值的极好指示符。团队中有意见的其他每个人都认为零和空字符串是可行的方法。
由于此错误,我无法在模拟器中运行我的应用: Error:null value in entry: streamOutputFolder=null 或 gradle - Error:null value
我正在尝试在 Android 应用程序中创建电影数据库,但它返回错误。知道这意味着什么吗? public Cursor returnData() { return db.query(TABLE
我一直在检查浏览器中的日期函数以及运行时间 new Date (null, null, null); 在开发工具控制台中,它给出了有效的日期 Chrome v 61 回归 Sun Dec 31 189
为什么 NA==NULL 会导致 logical (0) 而不是 FALSE? 为什么 NULL==NULL 会导致 logical(0) 而不是 TRUE? 最佳答案 NULL 是一个“零长度”对象
我是一名优秀的程序员,十分优秀!