- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 MOXy/JAXB 2.5.0 实现 Gang of Four 原型(prototype)模式的一个版本。我希望能够指定一个项目列表,其中一些项目“基于”其他项目,即从其他实例复制其数据。为了可重用性,我想创建一个任何可原型(prototype)对象都应该实现的接口(interface),它将为支持该模式所需的属性提供注释。
@XmlRootElement(name="IPrototype")
public interface IPrototype
{
/**
* Acts as a "copy constructor"
*/
@XmlAttribute(name="prototype")
@XmlIDREF
public void setPrototype(IPrototype prototype);
@XmlAttribute(name="id")
@XmlID
public void setId(String id);
public String getId();
}
理想情况下,实现对象看起来像这样,甚至不必费心从接口(interface)实现的方法的注释:
@XmlRootElement(name="Item")
public class Item implements IPrototype
{
private String m_id = null;
private String m_data = null;
public Item()
{
}
/**
* Never called
*/
@Override
public void setPrototype(IPrototype prototype)
{
m_data = ((Item)prototype).getData();
}
@Override
public void setId(String id)
{
m_id = id;
}
@Override
public String getId()
{
return m_id;
}
@XmlAttribute(name="data")
public void setData(String data)
{
m_data = data;
}
public String getData()
{
return m_data;
}
}
XML 看起来像:
<Wrapper>
<Item id="Item1" data="stuff and things" />
<Item id="Item2" prototype="Item1" />
</Wrapper>
其中 Wrapper 定义为:
@XmlRootElement(name="Wrapper")
public class Wrapper
{
@XmlElementRef
private ArrayList<Item> m_items = null;
}
如果它按照我想要的方式工作,我将得到一个包含两个元素的列表,这两个元素都是 Item 类型,并且包含相同的数据。但是,MOXy 似乎没有“看到”界面上的注释,并且我得到一个列表,其中包含两个没有设置 XmlID 的项目,并且 setPrototype() 从未被调用。唯一的解决方案似乎是在 Item 类中注释 setPrototype() 和 setId() 方法,但这似乎需要将 setPrototype() 的参数类型从 IPrototype 更改为 Item,以便 MOXy 将在正确的类中查找 XmlID。不幸的是,这破坏了继承的接口(interface)。
如果我将列表类型更改为 IPrototype,希望 MOXy 能够看到其注释,我会得到相同的行为 - null ID,setPrototype() 从未被调用。无论如何,这并不是我真正想要的,我希望能够限制哪些子类型可以包含在特定列表中。
不确定我对接口(interface)注释的工作方式有正确的期望,也许这就是我错误的根源。
关于如何让它发挥作用有什么想法吗?预先感谢,
史蒂夫
更新:如果我注释 Item 类,而不更改 setPrototype 的方法签名(我想我可以接受),我会得到一个包含两个项目的列表,并且正确设置了 XmlID,但 setPrototype() 仍然没有被调用。看起来 MOXy 正在寻找具有相同 XmlID 的 IPrototype 实例(不可能),而不是 Item 实例。
更新 2:而且,如果我将 IPrototype 转换为抽象类,一切都会完美运行。然而,考虑到 Java 的单继承模型,这对于旨在补充多继承层次结构的框架对象来说太有限了。所以还是卡住了。
最佳答案
通过注释 Item 的属性并使用泛型声明 setPrototype(),我得到了一个可以接受的运行版本。 IPrototype 中的声明如下所示:
public <T> void setPrototype(T prototype);
这是它在 Item 中的实现:
@XmlAttribute(name="prototype")
@XmlIDREF
@Override
public <T> void setPrototype(T prototype)
{
m_data = ((Item)prototype).getData();
}
它有效,但我不太喜欢重新注释子类。我对此提出了一个单独的问题,因为(对我来说)直观上看起来这不是接口(interface)注释应该工作的方式:
关于java - MOXy/JAXB "prototype pattern"- 接口(interface)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16807019/
我在嵌入式 Jetty 9.x 服务器内使用 Jersey 2.x 和内置的 MOXy 转换从 JSONPOJO。 是否可以以编程方式(在 POJO 上没有注释)为特定类型(例如 Joda DateT
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
Moxie看起来很驼鹿,但标题信息量不大, Moxie - Not Another Moose Clone 看了一下,好像用了 B::CompilerPhase::Hook 额外的伏都教。这个库的最终
我有一个基类声明如下: package com.mystuff.surrogates; import java.io.Serializable; import java.util.UUID; publ
我正在使用 MOXy 2.5.1 以及 Jersey 2.4 和 Hibernate。我发现 MOXy 与一组特定的类有奇怪的编码行为。 我有一些与此类似的类(为简洁起见,删除了其他内容): publ
我正在使用 MOXy 来解码一个相对简单的 XML 文档,但我得到了不一致的行为。该文档由两个元素组成,其中包含基本信息(名称和日期),后跟记录列表。问题是名称和日期每次都正确解码,但是我经常得不到任
我按照指示here进行操作为了为我的带注释的类生成 XML 架构。我使用 MOXy 作为 JAXB 的底层实现,因为我需要它的某些功能,例如 @XmlPath 以及它如何处理 XmlAdapter 的
是否可以根据某些运行时信息有条件地仅输出元素(作为 XML 或 JSON)? 我自己找到了答案,并想与大家分享。 最佳答案 简单: return null 示例 我有一个列表“alertStems”和
我有一个非常简单的类,有两个字段,String sourceAddress 和 int port。 我希望它们映射到源/地址和源/端口节点而不是 jaxb 默认的 sourceAddress 和 so
使用EclipseLink MOXy JAXB实现,我试图使用@XmlPath批注基于元素的属性值获取元素值。我似乎无法正常工作。支持吗? XML摘录: ... 12345 blah POJO
我使用 moxy 来构建大型结构,在 95% 的情况下,它的效果就像 charme 一样。它快速且可靠。但我现在确实有一个具有相同类结构但数据不同的项目。现在我确实产生了很大的阅读影响。写完整的项目大
为了解决另一个问题,我已从使用 Jersey 转向使用 EclipseLink MOXy 从 JAXB 创建的对象模型(由 Sun JAXB 2.1.12 创建)生成 JSON。我注意到的一个区别是输
我有一个相当大的对象树,我想将其导出为 XML。名为 Person 的对象在多个地方使用(作为许多子实体的 userCreated、userModified、作为客户端等) 根据 Person 对象的
我正在使用 JAXB/MOXy 解码一个包含大约 50 个此类对象的 XML 文件: @XmlRootElement(name="Message") public class MyClass{ pri
我有一个使用 Jersey 和 MOXy 的 JAX-RS 服务。我有一个返回类型 Memo 的 JSON 或 XML(取决于 Accept: header )表示的处理程序,但如果找不到该项目,它应
我试图找到包含等同于 的类的 Maven 依赖项 import org.eclipse.persistence.oxm.annotations.XmlVariableNode; 这是我目前拥有的 PO
我正在定义一个静态工厂方法: @XmlType(factoryClass=DummyFactory.class, factoryMethod="createNew") public abstract
我的问题是 this 的后续问题评论。 我在同一个类上混合使用 JPA 和 JAXB (MOXy) 注释,大多数情况下效果很好。如链接线程中所述,@XmlInverseReference 在编码双向关
我似乎无法让@XmlCData 注释起作用,即使 MOXy 已正确设置。 我的代码,attached , 输出: 1
我正在编写一段代码,使用 MOXy 在运行时设置 XmlTransient。以下是改编自 http://blog.bdoughan.com/2011/06/moxy-extensible-models
我是一名优秀的程序员,十分优秀!