标签: jaxb

JAXB:如何向内部元素添加属性

我有我想阅读的以下 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)

java attributes annotations jaxb java-6

2
推荐指数
1
解决办法
6063
查看次数

从字符串创建 JAXBElement&lt;Book&gt;

我定义了一个 Book 类,我想创建一个 JAXBElement 对象,该对象将包含与来自 String 对象的 XML 对应的信息。

例如,我可以有类似的东西:

String code = "<book><title>Harry Potter</title></book>";
Run Code Online (Sandbox Code Playgroud)

现在,我想从该字符串开始创建一个 JAXBElement。我需要该字符串来执行一些使用 JAXBElement 无法执行的验证。

那么,我可以做我想做的吗?如果是,如何?

谢谢!

索林

java xml jax-rs jaxb

2
推荐指数
1
解决办法
3787
查看次数

使用 JAXB 生成的代码中没有枚举

我的枚举类

@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”进行代码生成。

enums code-generation jaxb

2
推荐指数
1
解决办法
4455
查看次数

将不同的属性类型解组到同一个 java 对象时出现 NullPointerException


我在尝试解组 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)

java jaxb unmarshalling

2
推荐指数
1
解决办法
3635
查看次数

JAXB 绑定嵌套元素

我正在使用 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

有没有办法获得这个映射而不必创建这些额外的嵌套类?

java jaxb

2
推荐指数
1
解决办法
1834
查看次数

从 Spring WS Interceptor 获取请求参数

我正在使用带有 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 web-services spring-ws jaxb

2
推荐指数
1
解决办法
3617
查看次数

带有自定义注释的 Jaxb 编组

我有一个要求,根据字段上标记的自定义注释对 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 吗?我确信选择性编组会通过某些库或方式得到支持,经过相当多的搜索后我仍然无法弄清楚。任何帮助、建议或指示都受到高度赞赏。

java xml jaxb

2
推荐指数
1
解决办法
6481
查看次数

在 Jaxb 2.1 中用 @XmlTransient 注释 java 方法时出现的问题

我正在尝试@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在方法上使用吗?

java xml jaxb

2
推荐指数
1
解决办法
4104
查看次数

使用 JAXB XMLAnyElement 类型的样式返回动态元素名称

我在这些论坛以及其他博客文章中阅读了很多答案,但我似乎无法将这些部分联系在一起。

因此,我们从一个包含 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

java jaxb resteasy

2
推荐指数
1
解决办法
8097
查看次数

如何使用 JAXB 忽略绑定到 XML 的字段

我有一个简单的类,看起来像这样

    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 …

java xml jaxb

2
推荐指数
1
解决办法
6683
查看次数