ここでは、RESt Webサービス用の@ javax.xml.bind.annotation.Xml ...アノテーション付きクラスがあります。 Jerseyは春に管理されるWebコンテナに設定され、Webサービスは適切な形式のXMLを返します。 maven-enunciate-pluginを使用してWebサービスをドキュメント化し、返されたxmlドキュメントにxsdを作成します。私は今xsdファイルを返されたxmlファイル内のschemaLocationとして使用して、xml検証が不足している定義について不平を言わないようにしたいと考えています。 XMLシリアル化を設定するにはどうすればよいですか?Jersey JAXBシリアル化のXML出力をカスタマイズする方法
答えて
正しく覚えていれば、生成されたXMLに名前空間識別子が正しく書き込まれるようにするためにいくつかのことをしなければなりませんでした。
1)カスタムマーシャラ(およびアンマーシャラもBTW)を設定して返すJaxbFactoryを作成しました。私は、そのファクトリクラスはジャージーに「可視」ではありません)
//constructor
public JaxbFactory() throws Exception {
context = JAXBContext.newInstance(ResourceDto.class);
// Setup the marshaller
marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, XmlMetadataConstants.XML_SCHEMA_LOCATION); // this schema location is used in generating the schema-location property in the xml
}
2 ...ゲッターを省略/以下の設定を非整列化しています。それを表示するために、私はMarshallerProviderを作成します。すなわち、このようなものになります。私はジャージージャージーを使用して春に配線持っ
@Provider
public class ResourceJaxbMarshallerProvider implements ContextResolver<Marshaller> {
// injected by Spring
private ResourceJaxbFactory ResourceJaxbFactory;
private ResourceStatusJaxbFactory ResourceStatusJaxbFactory;
/*
* ----------------------------------------
* Setters (for Spring injected properties)
* ----------------------------------------
*/
public void setResourceJaxbFactory(ResourceJaxbFactory ResourceJaxbFactory) {
this.ResourceJaxbFactory = ResourceJaxbFactory;
}
public void setResourceStatusJaxbFactory(ResourceStatusJaxbFactory ResourceStatusJaxbFactory) {
this.ResourceStatusJaxbFactory = ResourceStatusJaxbFactory;
}
/*
* ------------------------
* Interface Implementation
* ------------------------
*/
public Marshaller getContext(Class<?> type) {
if (type == ResourceDto.class)
return ResourceJaxbFactory.getMarshaller();
else if (type == ResourceStatusDto.class)
return ResourceStatusJaxbFactory.getMarshaller();
else
return null;
}
}
を/春によって作成された春のサーブレットので、任意の@Providerクラスが自動的ジャージーによって認識されます。私のSpring applicationContext.xmlでは、リソースプロバイダをインスタンス化するだけです。それは、順番に、工場からマーシャルをつかむことになるでしょう。
3)私が批判的に感じたもう1つは、自分のリソースを含むルートパッケージにpackage-info.javaファイルを作成しなければならないということでした。次のようになります。
/*
* Note that this file is critical for ensuring that our ResourceDto object is
* marshalled/unmarshalled with the correct namespace. Without this, marshalled
* classes produce XML files without a namespace identifier
*/
@XmlSchema(namespace = XmlMetadataConstants.XML_SCHEMA_NAMESPACE, elementFormDefault = XmlNsForm.QUALIFIED)
package com.yourcompany.resource;
import javax.xml.bind.annotation.XmlNsForm;
少なくとも私は私が行うために必要なすべてのものだと思います、私は一つ一つの作品を思い出すことができません。私はpackage-info.javaのピースが最後のクリティカルなコグであったことを覚えています。
希望に役立ちます。私はwayyyyのすべての情報のための掘り下げにあまりにも多くの時間を費やしました。 Jerseyは、適切なxmlスキーマ検証(およびスキーマ無効入力の適切なエラー報告)を行う前に、魅惑的に単純でした。一度私がその道を始めると、ジャージーは脳死から簡単に難しいものに変わった。その難しさの大部分は、様々な投稿のオンラインからすべての詳細を掘り起こすことでした。うまくいけば、これはあなたをもっと遠くに、より速く助けるでしょう。 :-)
- 1. WCF XMLシリアル化をカスタマイズする方法
- 2. Xmlシリアル化JAXBとJackson-dataformat-xml?
- 3. Jersey/JAXB XML検証エラーのカスタムエラーメッセージ
- 4. カスタムXMLシリアル化メソッド内からデフォルトのXMLシリアル化を使用する方法
- 5. Jersey JAXBリストのMessageBodyWriterの実装方法
- 6. xmlシリアル化の出力を変更する
- 7. JAXBからカスタマイズされたマーシャル出力を作成する方法は?
- 8. JSON JAXBオブジェクト型のシリアル化
- 9. QtなしでQVariantの出力を逆シリアル化する方法
- 10. JAXB XML出力形式の質問
- 11. JAXB XMLを整形してXMLファイルを出力する
- 12. データベースのXML出力をJAXBの派生オブジェクトモデルにマップする方法
- 13. PointFオブジェクトのシリアル化をカスタマイズする方法#
- 14. JAXB-RI with Jersey
- 15. カスタムXMLシリアル化を行う方法
- 16. シリアル化にXML属性を入力
- 17. XMLシリアル化 - XMLルート
- 18. リストを非整列化する<foo> JAXB/Jersey
- 19. .Net XMLのシリアル化の例外を処理する方法?
- 20. C++でのXMLシリアル化/逆シリアル化
- 21. オブジェクトxmlのシリアル化/逆シリアル化
- 22. このxmlドキュメントをリストに逆シリアル化する方法
- 23. 繰り返し要素のXMLノードをシリアル化する方法
- 24. オブジェクトへのxml応答を逆シリアル化する方法
- 25. JAXBを使用したJersey RESTful APIのJSON出力にヌル要素を含む
- 26. シリアル化XML
- 27. XMLシリアル化
- 28. XMLシリアル化
- 29. Xmlシリアル化
- 30. xmlシリアル化エラー