1

より明確になる私のコードをお見せします:

@XmlRootElement
FilePollerConf{

    ArrayList<Directory> directoriesList = new ArrayList<Directory>();

}

Directory{

    ArrayList<Match> matchList = new ArrayList<Match>();

}

Match{

    ArrayList<Event> eventsList = new ArrayList<Event>();

}

Event{

    ArrayList<IAction> actionsList = new ArrayList<IAction>();

}

IAction{

    void send();

}

これがポイントです。jaxbで非整列化しようとすると、エラーが発生します:

IAction はインターフェースであり、JAXB はインターフェースを処理できません。

だから私は@XmlAdapterを探しましたが、私のようなユースケースは見られなかったので、それを使用できるかどうか本当にわかりませんか? 私は引き続き検索しますが、アイデアがあれば大歓迎です! 私はすでに私のxmlを実際に持っています.jaxbが私を生成することを望みます(あなたにxmlを与えてください):

<?xml version="1.0" encoding="utf-8"?>
<FilePollerConfiguration>
    <Directory path="C://Users//jmoreau040612//Desktop//Old">
        <Match pattern="*.xml">
       <Event name="create">
           <FTPSend>
          <FTPServer>toto.com</FTPServer>
          <FTPPort>21</FTPPort>
          <Login>toto</Login>
          <Password>titi</Password>
          <destinationPath>/root/src</destinationPath>
      </FTPSend>
       </Event>
   </Match>
        <Match pattern="*.csv">
       <Event name="modify">
           <MailSend>
          <Name>MailSend</Name>
          <SMTPServer>smtp.fr.gric</SMTPServer>
          <SMTPPort>25</SMTPPort>
          <MailTo>toto@rock.com</MailTo>
          <MailFrom>titi@rock.com</MailFrom>
          <Subject>tata</Subject>
          <Body>blabla</Body>
      </MailSend>
       </Event>
   </Match>
    </Directory>
    <Directory path="C://Users//jmoreau040612//Desktop//New">
        <Match pattern="*.csv">
       <Event name="create">
           <ServerToServer>
                    <location>ergrthrhdrth</location>
                    <destination>ergergeg</destination>
                </ServerToServer>    
       </Event>
   </Match>
   <Match pattern="*.csv">
       <Event name="delete">
           <SFTPSend>
          <SFTPServer>toto.sgcib.com</SFTPServer>
          <SFTPPort>21</SFTPPort>
          <Login>toto</Login>
          <Password>titi</Password>
          <destinationPath>/root/src</destinationPath>
          <PrivateKeyFile>C://Desktop/privatekey.prk</PrivateKeyFile>
      </SFTPSend>
       </Event>
   </Match>
    </Directory>
</FilePollerConfiguration>

ポイントは、私の構造が常に同じであるとは限らないということです。それで、jaxb を使用できますか?

4

3 に答える 3

0

うまくいくかどうかわかりませんが、インターフェイスの代わりに抽象クラスを試しましたか?

JaxB は、変換を行うためにクラスをインスタンス化する必要があるのだろうか...

于 2013-10-10T10:11:24.617 に答える
0

@XmlAnyElementインターフェイスを要素として含むクラスのマーシャリングおよびアンマーシャリングのエラーを回避するために使用できることを知っています。これは、アンマーシャリング時のタイプである欠点につながります。具象クラスで特定の名前を使用@XmlAnyElement(lax=true)して指定するか@XmlRootElement、非整列化される要素で xsi:type を指定すると、具象クラスに対して完全に非整列化されます。後者の方法はわかりませんが、前者の使い方は非常に簡単です ( @XmlRootElement(name="my-concrete-element"))。

例として:

public interface Abstract {

    public void setData(String data);
    public String getData();

}

@XmlRootElement(name = "concrete1")
@XmlAccessorType(XmlAccessType.FIELD)
public class Concrete1 implements Abstract {

    @XmlElement
    private String data;

    @Override
    public void setData(String data) {
        this.data = data;
    }

    @Override
    public String getData() {
        return this.data;
    }

    @Override
    public String toString() {
        return "@Concrete1{data: " + this.data + "}";
    }

}

@XmlRootElement(name = "concrete2")
@XmlAccessorType(XmlAccessType.FIELD)
public class Concrete2 implements Abstract {

    @XmlElement
    private String data;

    @Override
    public void setData(String data) {
        this.data = data;
    }

    @Override
    public String getData() {
        return this.data;
    }

    @Override
    public String toString() {
        return "@Concrete2{data: " + this.data + "}";
    }

}

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

    @XmlElement
    private String prop;

    @XmlElementWrapper(name = "abstracts")
    @XmlAnyElement(lax = true)
    private ArrayList<Abstract> abstracts;

    public void setAbstracts(ArrayList<Abstract> abstracts) {
        this.abstracts = abstracts;
    }

    public ArrayList<Abstract> getAbstracts() {
        return abstracts;
    }

    @Override
    public String toString() {
        String ret = "{prop: " + this.prop + ", abstracts: [";
        Object[] abstracts = this.abstracts.toArray();
        for(Object abstract: abstracts) {
            ret += abstract.toString() + ", ";
        }
        return ret + "]}";
    }

    public void setProp(String prop) {
        this.prop = prop;
    }

    public String getProp() {
        return prop;
    }

}

ハードコードされたソリューションを使用せずに xsi:type を具象クラスに強制的に表示する方法を誰かが知っている場合は、ソリューションを共有していただければ幸いです。

于 2020-04-30T14:07:44.930 に答える