草庐IT

java - @XmlEnum 属性与 JAXB

coder 2024-06-29 原文

我在使用 jaxb 创建枚举以生成我想要的 xml 时遇到问题,我尝试使用 @xmlEnum 注释但没有使用属性!

我会给你举个例子来阐明这一点:

XML

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<FilePollerConfiguration configFilePath="">
    <Directory path="C://Users//jmoreau040612//Desktop//Old">
        <Match pattern="*.xml">
            <Event name="create | modify | delete"> //here i want the enum in attribute
           <FTPSend>
          <FTPServer>toto.sgcib.com</FTPServer>
          <FTPPort>21</FTPPort>
          <FTPLogin>toto</FTPLogin>
          <FTPPassword>titi</FTPPassword>
                  <FTPDestinationPath>/root/src</FTPDestinationPath>
      </FTPSend>
       </Event>
   </Match>
   <Match pattern="*.csv">
       <Event name="create | modify | delete"> //here i want the enum in attribute
           <MailSend>
           <SMTPServer>smtp.fr.socgen</SMTPServer>
           <SMTPPort>25</SMTPPort>
           <MailTo>toto@sgcib.com</MailTo>
           <MailFrom>titi@sgcib.com</MailFrom>
           <Subject>tata</Subject>
           <Body>blabla</Body>
       </MailSend>
        </Event>
    </Match>
</Directory>
</FilePollerConfiguration>

java 部分我有以下代码:

@XmlAccessorType(XmlAccessType.FIELD)
public class Event {

     //I would like this enum in attribute of "Event"
@XmlType
@XmlEnum(String.class)
public enum name{
    @XmlEnumValue("create") CREATE,
    @XmlEnumValue("modify") MODIFY,
    @XmlEnumValue("delete") DELETE
}

@XmlElements(value = {
         @XmlElement(type=FTPSendConfiguration.class, name="FTPSend"),
         @XmlElement(type=SFTPSendConfiguration.class, name="SFTPSend"),
         @XmlElement(type=MailSendConfiguration.class, name="MailSend"),
         @XmlElement(type=
                 ServerToServerSendConfiguration.class,    name="ServerToServer")
})
ArrayList<IAction> actionsList = new ArrayList<IAction>();

public Event(){

}

public ArrayList<IAction> getActionsList() {
    return actionsList;
}

public void setActionsList(ArrayList<IAction> actionsList) {
    this.actionsList = actionsList;
}

}

因此,如果您有任何想法,不客气 =)

谢谢。

最佳答案

尝试向您的类添加另一个字段并将其标记为@XmlAttribute:

@XmlAttribute(name="name")  // "name" will be the name of your attribute in the xml file
name eventAttribute;        // this field has type name (your enum that probably should be better to call in a different way ...)

如果我正确理解了您的需求,这应该可以解决您的问题。

再见!

更新(使用 schemagen 生成的 .xsd 文件):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="event">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="FTPSend" type="xs:string"/>
        <xs:element name="SFTPSend" type="xs:string"/>
        <xs:element name="MailSend" type="xs:string"/>
        <xs:element name="ServerToServer" type="xs:string"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="name" type="name"/>
  </xs:complexType>

  <xs:simpleType name="name">
    <xs:restriction base="xs:string">
      <xs:enumeration value="create"/>
      <xs:enumeration value="modify"/>
      <xs:enumeration value="delete"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

您可以看到 complexType event 有一个名为“name”的属性,类型为“name”,类型名称定义为 simpleType 使用枚举

最终更新:

这是我写的:

package jaxb;

import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Event {

    // I would like this enum in attribute of "Event"
    @XmlType
    @XmlEnum(String.class)
    public enum name {
        @XmlEnumValue("create")
        CREATE, @XmlEnumValue("modify")
        MODIFY, @XmlEnumValue("delete")
        DELETE
    }

    @XmlAttribute(name = "name")
    name eventAttribute;

    public name getEventAttribute() {
        return eventAttribute;
    }

    public void setEventAttribute(name eventAttribute) {
        this.eventAttribute = eventAttribute;
    }

    @XmlElements(value = {
            @XmlElement(type = FTPSendConfiguration.class, name = "FTPSend"),
            @XmlElement(type = SFTPSendConfiguration.class, name = "SFTPSend"),
            @XmlElement(type = MailSendConfiguration.class, name = "MailSend"),
            @XmlElement(type = ServerToServerSendConfiguration.class, name = "ServerToServer") })
    ArrayList<IAction> actionsList = new ArrayList<IAction>();

    public Event() {

    }

    public ArrayList<IAction> getActionsList() {
        return actionsList;
    }

    public void setActionsList(ArrayList<IAction> actionsList) {
        this.actionsList = actionsList;
    }

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Event.class);
        Event e = new Event();
        e.eventAttribute = name.CREATE;  // I set this field using the enum (it could be set to name.DELETE or name.MODIFY as well)
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(e, System.out);
    }
}

如果执行main方法,结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<event name="create"/>

这是一个带有来自枚举的属性的事件标签......

我希望这最后的尝试能帮到你......

关于java - @XmlEnum 属性与 JAXB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19537320/

有关java - @XmlEnum 属性与 JAXB的更多相关文章

  1. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  3. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  6. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐