我有我想阅读的以下 XML。在 java 1.6 上使用 JAXB,如何为属性 regex 注释?我可以将字段设为 boolean 类型吗?
<?xml version="1.0" encoding="utf-8"?>
<authStore>
<authList>
<auth>
<resource>res1</resource>
<privilege regex = "true">PRIV_FILE_.+?_READ</privilege>
</auth>
<auth>
<resource>res2</resource>
<privilege>PRIV_FILE_READ</privilege>
</auth>
</authStore>
Run Code Online (Sandbox Code Playgroud)
更新:是否可以将属性设为可选?如果是,当我解组时,当特权元素没有可选属性 regex 时,我是否会得到 regex 字段为假?
UDPATE2 :我不想为资源和权限定义单独的类。另外,我不想使用 MOXy。请。建议仅适用于 sun/oracle JDK 1.6 JAXB 的解决方案。
UPDATE3:我当前的对象模型是这样的
// AuthStore.java
@XmlRootElement
public class AuthStore {
@XmlElementWrapper(name = "authList")
@XmlElement(name = "auth")
private ArrayList<Auth> authList;
public void setAuthList(ArrayList<Auth> authList) {
this.authList = authList;
}
public ArrayList<Auth> getAuthsList() {
return authList;
}
}
// Auth.java
@XmlRootElement(name = "auth")
@XmlType(propOrder …Run Code Online (Sandbox Code Playgroud) 我定义了一个 Book 类,我想创建一个 JAXBElement 对象,该对象将包含与来自 String 对象的 XML 对应的信息。
例如,我可以有类似的东西:
String code = "<book><title>Harry Potter</title></book>";
Run Code Online (Sandbox Code Playgroud)
现在,我想从该字符串开始创建一个 JAXBElement。我需要该字符串来执行一些使用 JAXBElement 无法执行的验证。
那么,我可以做我想做的吗?如果是,如何?
谢谢!
索林
我的枚举类
@XmlType
@XmlEnum(Integer.class)
public enum Error {
@XmlEnumValue("1")
ENUM_VALUE_1(1, "some string 1", "some string 1"),
@XmlEnumValue("2")
ENUM_VALUE_2(2, "some string 2", "some string 2");
private Error(int errorCode, String msgKey, String message) {
this.errorCode = errorCode;
this.msgKey = msgKey;
this.message = message;
}
}
Run Code Online (Sandbox Code Playgroud)
生成的 xsd
<xs:simpleType name="error">
<xs:restriction base="xs:int">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
</xs:restriction>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)
我正在使用的绑定
<jaxb:bindings schemaLocation="schema.xsd">
<jaxb:bindings node="//xs:simpleType[@name='error']">
<jaxb:typesafeEnumClass ref="packageName.Error" />
</jaxb:bindings>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)
问题是没有生成枚举文件。我正在使用“maven-jaxb2-plugin”进行代码生成。
我在尝试解组 XML 时遇到了一个严重的问题。起初,成员元素的“值”属性中仅包含 Integer(如第一个 'EnumType' 元素),但是,现在另一个 'EnumType' 以字符串作为值出现 - 我得到了下面的 NullPointerException。
请注意,Member.java 中的“value”成员最初来自“int”类型(当仅接受 Integer 作为 Member 元素的值时)并且它工作正常。只有当我将它更改为 Object (我想这是我的问题的根源)时 - 出现以下异常。
XML:
<EnumType Name="Genre" UnderlyingType="Edm.Int32">
<Member Name="ACTION" Value="0"/>
<Member Name="COMEDY" Value="1"/>
</EnumType>
<EnumType Name="Rating" UnderlyingType="Edm.String">
<Member Name="RatingA" Value="G"/>
<Member Name="RatingB" Value="PG"/>
</EnumType>
Run Code Online (Sandbox Code Playgroud)
枚举类型
@XmlRootElement
public class EnumType {
@XmlElement(name = "Member", namespace = "http://schemas.microsoft.com/ado/2009/11/edm")
private List<Member> members = new LinkedList<Member>();
public List<Member> getMembers() {
return members;
}
}
Run Code Online (Sandbox Code Playgroud)
会员.Java
@XmlRootElement
public class Member {
@XmlAttribute(name = "Name")
private String name; …Run Code Online (Sandbox Code Playgroud) 我正在使用 JAXB-impl。我需要能够将嵌套元素作为简单类型映射到类字段。例如:
<mapping>
<search>
<channel>main-channel</channel>
<url>my-channel-url</url>
</search>
<items>
<item>first</item>
<item>second</item>
<item>third</item>
</items>
</mapping>
Run Code Online (Sandbox Code Playgroud)
假设我需要将“url”标签绑定到类中的一个字段,这将不起作用(当然):
class Mapping{
@XmlElement
private String url;
}
Run Code Online (Sandbox Code Playgroud)
@XmlElementWrapper,仅用于集合。我看过一些关于使用 eclipse MOXy 的帖子,并使用了 @XmlPath,但这不是一个选项。它必须是 JAXB-impl。
供参考:http : //wiki.eclipse.org/EclipseLink/Examples/MOXy/XPath#Marshal_to_XML_-_MOXy_Customization_.231_-_Grouping_Element
有没有办法获得这个映射而不必创建这些额外的嵌套类?
我正在使用带有 Spring WS 的 Jaxb 2,并且我有一个拦截器,它被定向到一个特定的有效负载,它工作正常。
这里我的需求是从我的拦截器的handleRequest方法中读取请求参数。我知道这应该是相当直接的。但是无法找到读取请求参数的方法。目前我的 handleRequest 方法如下所示。
@Override
public boolean handleRequest(MessageContext messageContext, Object endpoint)
throws Exception {
boolean proceed = true;
SaajSoapMessage saajSoapMessage =
(SaajSoapMessage) messageContext.getRequest();
SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();
Document doc = saajSoapMessage.getDocument();
Element element = doc.getElementById("request");
}
Run Code Online (Sandbox Code Playgroud)
我的端点类的相关部分是
@PayloadRoot(namespace = NAMESPACE, localPart = "confirOrderRequest")
public @ResponsePayload ConfirmOrderResponse handleConfirmOrder(
@RequestPayload ConfirmOrderRequest confirmOrderRequest) {
...........
}
Run Code Online (Sandbox Code Playgroud)
这里我的要求是获取ConfirmOrderRequest拦截器 handleRequest 方法中附带的 orderId ,有没有办法直接做到这一点,或者我需要为此做一些 XML 解析?
我有一个要求,根据字段上标记的自定义注释对 java pojo 的某些元素进行编组/解组。假设我的 java pojp 中有 3 个字段
@CustomVersion("v1")
private String field1;
@CustomVersion("v1","v2")
private String field2;
@CustomVersion("v2")
private String field3;
Run Code Online (Sandbox Code Playgroud)
如果我在 jaxb 中转换时传递 version="v1" 参数,我只想编组带有 v1 的字段。如果我通过 v2,所有带有 v2 注释的字段应该只被编组。
甚至可以使用 jaxb 吗?我确信选择性编组会通过某些库或方式得到支持,经过相当多的搜索后我仍然无法弄清楚。任何帮助、建议或指示都受到高度赞赏。
我正在尝试@XmlTransient像下面这样在我的 java 类中注释我的 java 方法。
@XmlAccessorType(XmlAccessType.PROPERTY)
public abstract class MyClass {
@XmlTransient
public void addsomething{
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试通过其他类在我的 JaxBContext 中使用此类时,出现以下异常
JAXB annotation is placed on a method that is not a JAXB property
this problem is related to the following location:
at @javax.xml.bind.annotation.XmlTransient()
Run Code Online (Sandbox Code Playgroud)
,
但是当我看到XmlTransient()注释定义时,(@Target(value={FIELD,METHOD,TYPE}))它清楚地表明是使用方法。并且在 JavaDoc(http://docs.oracle.com/javaee/7/api/javax/xml/bind/annotation/XmlTransient.html)中说
The @XmlTransient annotation can be used with the following program elements:
a JavaBean property
field
class
Run Code Online (Sandbox Code Playgroud)
我不能@XmlTransient在方法上使用吗?
我在这些论坛以及其他博客文章中阅读了很多答案,但我似乎无法将这些部分联系在一起。
因此,我们从一个包含 Map 属性的基本 POJO 开始。如何包装它已经很好地确定了,但这会返回一些值。我要做的是取然后名称(又名标签)并使其成为有效的 XML“属性”。所以我们会得到一些价值。
我找到了一个例子(如果我能再次找到它会链接)如下:
@XmlAnyElement
public List<JAXBElement<String>> getXmlProperties() {
List<JAXBElement<String>> elements = new ArrayList<JAXBElement<String>>();
for (Map.Entry<String, String> property: properties.entrySet())
elements.add(new JAXBElement<String>(new QName(property.getKey()),
String.class, property.getValue()));
return elements;
}
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但我在我的 Bean/Pojo 类中有这个,它与 GWT 前端共享,因此不能包含对 JAXBElement 和 QName 的引用(需要源代码)。
那么,有没有办法使用 XmlAdapter 和 JAXBElement/QName/XmlAnyElement 梦之队之类的东西来获得类似的结果?顺便说一句,如果考虑到这些因素,我正在使用 RESTEasy。
这是带有@XmlAnyElement+JAXBElement 的论坛帖子: Dynamic tag names with JAXB
我有一个简单的类,看起来像这样
import nl.hu.pf.coproco.model.Observeable;
@XmlRootElement (name = "Purpose")
@XmlAccessorType (XmlAccessType.FIELD)
public class Purpose implements Observeable{
private String name;
private ArrayList<Observer> observers;
@XmlElement (name = "subPurpose")
private ArrayList<Purpose> subPurposes;
//methods
}
Run Code Online (Sandbox Code Playgroud)
但是 Observable 是一个接口,所以我得到一个异常,因为 JAXB 不能处理接口。我试图弄清楚如何使用 忽略该字段,ArrayList<Observer>因此它不会被导出到 xml。
我尝试使用@XmlTransient注释但我得到以下eceptionjavax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"purpose"). Expected elements are <{}Purpose>
这发生在解组时,但我也想编组那个班级
示例 xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<purpose>
<name>All Purposes</name>
<subPurpose>
<name>Creational</name>
</subPurpose>
<subPurpose>
<name>Structural</name>
</subPurpose>
<subPurpose>
<name>Behavioral</name>
<subPurpose>
<name>Behavioral 1</name>
</subPurpose>
<subPurpose>
<name>Behavioral 2</name>
</subPurpose>
</subPurpose>
</purpose>
Run Code Online (Sandbox Code Playgroud)
界面Observable …
jaxb ×10
java ×9
xml ×4
annotations ×1
attributes ×1
enums ×1
java-6 ×1
jax-rs ×1
resteasy ×1
spring-ws ×1
web-services ×1