2011-08-12 11 views
4

ここでは、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出力をカスタマイズする方法

答えて

7

正しく覚えていれば、生成された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スキーマ検証(およびスキーマ無効入力の適切なエラー報告)を行う前に、魅惑的に単純でした。一度私がその道を始めると、ジャージーは脳死から簡単に難しいものに変わった。その難しさの大部分は、様々な投稿のオンラインからすべての詳細を掘り起こすことでした。うまくいけば、これはあなたをもっと遠くに、より速く助けるでしょう。 :-)

関連する問題