- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在源代码中使用 Guava 可选字段,并且想要将使用可选的对象编码(marshal)至 xml,因此我使用了 JAXB。
我为此创建了一个XMLAdapter
:
public abstract class OptionalAdpater<T> extends XmlAdapter<T, Optional<T>> {
@Override
public Optional<T> unmarshal(T v) throws Exception {
return Optional.of(v);
}
@Override
public T marshal(Optional<T> v) throws Exception {
if (v == null) {
return null;
}
return v.isPresent() ? v.get() : null;
}
}
但是当我在类里面使用它时
@XmlRootElement(name = "test")
public class Test {
private Optional<Integer> optionalValue = Optional.absent();
@XmlElement(name = "optional-value", type = Integer.class)
@XmlJavaTypeAdapter(type = Integer.class, value = OptionalIntegerAdapter.class)
public Optional<Integer> getOptionalValue() {
return optionalValue;
}
public void setOptionalValue(Optional<Integer> optionalValue) {
this.optionalValue = optionalValue;
}
}
JAXB 失败并出现 NullPointerException
。我不明白的是,如果我不使用可选类型而只使用盒装整数并且值为 null
那么 JAXB 会跳过对该字段的编码,但当我使用适配器类型可选。
追踪:
Exception in thread "main" java.lang.NullPointerException
at com.sun.xml.internal.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$17.print(RuntimeBuiltinLeafInfoImpl.java:717)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$17.print(RuntimeBuiltinLeafInfoImpl.java:711)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$StringImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:149)
at com.sun.xml.internal.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:241)
at com.sun.xml.internal.bind.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:114)
at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:341)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:582)
at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:323)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:483)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:308)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:236)
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:103)
最佳答案
这是罪魁祸首的代码:
primaryList.add(new StringImpl<Integer>(Integer.class,
createXS("int"),
createXS("unsignedShort")
) {
public Integer parse(CharSequence text) {
return DatatypeConverterImpl._parseInt(text);
}
public String print(Integer v) {
return DatatypeConverterImpl._printInt(v);
}
});
_printInt
接受int
因此,如果返回空整数,则隐式拆箱。
为什么它在没有适配器/可选的情况下也能工作,可能是因为可选的。某处可能有一些逻辑检查 null
的属性。你没有null
,您有 Optional
.
从我的角度来看,这是 JAXB 中的一个错误。运行时应检查 null
在适配器转换它们之后,而不是之前。
如何解决它 - 我认为目前唯一的方法是调整您的 Optional<Integer>
到字符串而不是 Integer
.
关于java - 使用 XMLAdapter 时 JAXB 无法编码(marshal) null 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25932803/
我有一个基于 XML 的数据库,并且定义了一个用户模型,其中包含对角色(另一个模型)的引用列表。我已将 XMLAdapter 附加到 Roles 属性以自动填充角色。为此,我已在此适配器中 @auto
我正在使用 JAXB(以及一些用于 XSLT 的 Saxon)解码 XML 数据。在我的 XML 文档中,我有一个日期字符串值。 我做了一些研究并尝试了 XMLAdapter 和 @XMLJavaTy
我将 CXF 2.4 与 JAXB 结合使用。 我可以为我的 owm 类(例如 LWDate)的所有实例设置一个全局 XmlAdapter 吗? 我写了一个类: public class LWDate
有没有办法在 XmlAdapter 中检索当前的基本 URI?或者这通常是如何实现的? public class Service{ ... @GET public MyEntity g
我正在尝试让 XmlAdapter 到 HashMap 工作,但我一直收到异常。我关注了this blog entry非常接近,我已经多次检查我的代码,但我没有看到问题。 我正在使用最新版本的 org
我需要生成一个 XML使用以下格式的文件 JAXB2 , 它同时具有固定 和可变 xml 内容。 约束是什么? 变量的内容XML零件应该是 5 个不同的 XML schema 之一(计划让 JAXB2
此类的实例是大型对象图的一部分,不在对象图的根部: public class Day { public Day(LocalDate date, List times) {
我正在制作一个应用程序,它将包含 XML 文件中的数据。 我现在遇到一个问题:JAXB 不编码我的子类,因此当我编码 XML 文件时,所有对象都是父类的对象。我尝试了 @XMLSeeAlso、Acce
我想转换我的 payaload 中的项目列表,并将它们转换为 HashMap 。基本上,我拥有的是一个 Item xml 表示,其中包含一个 ItemID 列表。每个 ItemID 中都有一个 idT
当我试图直接解码一个根对象时,我遇到了 jaxb 的 XMLAdapters 的限制,而不是它是另一个对象中的一个字段,因此绕过了@XmlJavaTypeAdapter 我宁愿不包装我的对象,因为这会
我有一个外部(即不可修改的)com.external.Money 类,它有一个带有 getter 和 setter 的 java.util.Currency 字段。在我的 CXF jaxws 网络服务
我正在使用 JAXB XMLadapter 来编码和解码 boolean 值。应用程序的 XML 文件也将由 C# 应用程序访问。我们必须验证此 XML 文件,这是使用 XSD 完成的。 C# 应用程
我必须生成一个 xml 元素,该元素的值可以是任何“原始类型”(xsd:string、xsd:boolean 等)。示例: String Value 2011-10-21 2011-10-21T12:
有了这个 Jaxb Xml 定义,我尝试通过添加 @XmlPath(".") 来删除 Map Elements Wrapper但在解码期间会导致异常 @XmlRootElement public ab
我想使用 EclipseLink MOXy 将对象树持久保存为 XML。但我希望使用自定义的 DoubleAdapter 来编写所有 double 类型的字段。我知道我可以使用基于包的注释来做到这一点
我正在尝试创建一个 @XmlAdapter 以将混合列表中的单词拆分为名为 Word 的 Wrapper 类的对象。该字段还可能包含名为 Group 的 Word 扩展的实例。 这个想法是这样的: S
我需要为特定的 XmlAdapter 安装 DefaultValidationEventHandler。从我读过的内容来看,你只能这样做: JAXBContext context = JAXBCont
我正在使用 jaxbMarshaller 为第三方库类生成 xml。由于将 Calendar 对象转换为字符串的库 XmlAdapter 不使用 TimeZone 字段,因此编码器为 pojo 类的每
如何将 EJB 注入(inject)到 XmlAdapter 中? 我的想法是,我想通过 REST API 获取 ID 列表,并将该 ID 数组转换为实体对象的对象列表。例如: public clas
我正在使用以下源代码执行一个 Maven 项目 package com.coderplus.jaxb; import java.util.HashMap; import javax.xml.bind.
我是一名优秀的程序员,十分优秀!