JAXBのValidationEventHandlerのhandleEventメソッドが呼び出されていません

madplayの:

私は捕獲しようとしているValidationEventXMLルールで許可されていない文字で。(例えば、「&」)また、私はセットアップValidationEventHandlerアンマーシャリングエラーをチェックします。私が使用してアンマーシャリングしようとしたInputStreamが、イベントハンドラは、エラーをキャッチしません。handleEventこの方法は、まったく実行されません。一方、使用してはStringReader正常に動作します。

私はすでに説明Javadocを読んだunmarshal方法を。しかし、私はそれがValidationEventを捉えることができなかったことがわかりませんでした。

指定されたInputStreamから非整列化するXMLデータと結果のコンテンツツリーを返します。非整列化APIのこのフォームを使用する場合、検証イベントの位置情報が不完全であってもよいです。

最後の試行では、私はオンラインで検索してみてくださいでしたが、私は何かを見つけることができませんでした。
すべてのヘルプは理解されるであろう:D

エクストラ質問:

私は質問を追加して申し訳ありません。私は定義された(POJOクラスが...少し変更されている)でPOJOクラスフィールドを@XmlPathXML要素名とは異なる注釈が、それが動作するようには思えません。私はそれがのXmlElementとして使用する必要がありますか?


POJOクラス:

import org.eclipse.persistence.oxm.annotations.XmlPath;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement
class Article {
    private String title;
    private String category;
    private List<ArticleImage> imageList;

    public String getTitle() {
        return title;
    }

    @XmlElement
    public void setTitle(String title) {
        this.title = title;
    }

    public String getCategory() {
        return category;
    }

    @XmlElement
    public void setCategory(String category) {
        this.category = category;
    }

    public List<ArticleImage> getImageList() {
        return imageList;
    }

    // for Extra Question... :D
    @XmlPath("image")
    public void setImageList(List<ArticleImage> imageList) {
        this.imageList = imageList;
    }
}

class ArticleImage {
    private String url;
    private String ext;

    public String getUrl() {
        return url;
    }

    @XmlAttribute
    public void setUrl(String url) {
        this.url = url;
    }

    public String getExt() {
        return ext;
    }

    @XmlAttribute
    public void setExt(String ext) {
        this.ext = ext;
    }
}


ValidationEventHandler:

import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.bind.ValidationEventLocator;

class CustomValidationHandler implements ValidationEventHandler {

    // This method is not reached when debugging.
    @Override
    public boolean handleEvent(ValidationEvent event) {
        if (event.getSeverity() == ValidationEvent.FATAL_ERROR ||
                event.getSeverity() == ValidationEvent.ERROR) {
            ValidationEventLocator locator = event.getLocator();
            throw new RuntimeException("Error in EventHandler. line number: " + locator.getLineNumber());
        }
        return true;
    }
}


非整列化コード:

import org.eclipse.persistence.jaxb.JAXBContextFactory;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class SomeTest {

    public void someMethod() {
        String xmlString = "<article type=\"item\">\n"
                + "    <title>M&A</title>\n"
                + "    <category>1234-1234</category>\n"
                + "    <image url=\"hello\" ext=\"jpg\"/>\n"
                + "</article>";

        try (InputStream fileInputStream = new ByteArrayInputStream(xmlString.getBytes())) {
            JAXBContext context = JAXBContextFactory.createContext(new Class[]{Article.class}, null);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            unmarshaller.setEventHandler(new CustomValidationHandler());
            Article article = (Article) unmarshaller.unmarshal(fileInputStream);

            System.out.println(article.getTitle());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new SomeTest().someMethod();
    }
}
martidis:

当初置き換えることが示唆

JAXBContext context = JAXBContextFactory.createContext(new Class[]{Article.class}, null);

JAXBContext context = JAXBContext.newInstance(Article.class);

JAXBContextFactory.createContextの実装では、あなたの場合には、あなたが記事を渡すclassesToBeBoundは、「委任するJAXBの実装を見つけることができません」であることのため例外が発生し、いくつかのチェックを行うことがわかります。これはあなたのコードを実行しているときに私が持っていた問題であり、私はあなたにも持っていたと仮定しました。次に、あなたのイベントハンドラは(私のセットアップで少なくとも)と呼ばれていました。

後で、「... 『』 ...クラスは、同じ名前の2つのプロパティを持つ」価値の問題を持っていたし、私はそれが起こる理由を説明し、このリンクをチェックすることを提案しました。

リンクは次のとおりです。フィールドの前とゲッター宣言の前@XmlElementを使用しての違いは何ですか?

新しい質問にはお答えする編集:

あなたがでやろうとしているか尋ねる私を気にしない場合は@XmlPath("image")

あなたのPOJOの構造は、XMLと一致していません。注釈を削除し、以下のように、画像のためのセッターメソッドを変更します。

@XmlRootElement
class Article {
    private String title;
    private String category;
    private List<ArticleImage> imageList;

    public String getTitle() {
        return title;
    }

    @XmlElement
    public void setTitle(String title) {
        this.title = title;
    }

    public String getCategory() {
        return category;
    }

    @XmlElement
    public void setCategory(String category) {
        this.category = category;
    }

    public List<ArticleImage> getImage() {
        return imageList;
    }

    // for Extra Question... :D
    // method name changed!
    public void setImage(List<ArticleImage> imageList) {
        this.imageList = imageList;
    }
}

class ArticleImage {
    private String url;
    private String ext;

    public String getUrl() {
        return url;
    }

    @XmlAttribute
    public void setUrl(String url) {
        this.url = url;
    }

    public String getExt() {
        return ext;
    }

    @XmlAttribute
    public void setExt(String ext) {
        this.ext = ext;
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=137408&siteId=1