2017-02-03 5 views
0

私はJBoss上で動作する古いアプリケーションをSpring Boot/Tomcatに移植しており、ほとんどのものは応答XML以外で動作しています。古いコードは、XSDソースの生成にxmlbeansを使用しているようです。私はこれをJAXBを使うように変更しました。応答XMLここ@RestControllerから返されたJAXBクラスXML要素wooky

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "getAllEventCodesResponseType", propOrder = { 
    "_return", 
    "results" 
}) 
public class GetAllEventCodesResponseType { 

    @XmlElement(name = "Return", required = true) 
    protected ReturnType _return; 
    @XmlElement(name = "Results") 
    protected GetAllEventCodesResponseType.Results results; 

    // Getters and setters 
} 

です:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "EventsResponseType1_1", propOrder = { 
    "getAllEventCodesResponse", 
    "saveEventCodeResponse", 
    "failMessageResponse", 
    "getEmailHistoryResponse" 
}) 
public class EventsResponseType11 { 

    protected GetAllEventCodesResponseType getAllEventCodesResponse; 
    protected SaveEventCodeResponseType saveEventCodeResponse; 
    @XmlElement(name = "FailMessageResponse") 
    protected ResponseType failMessageResponse; 
    protected GetEmailHistoryResponseType getEmailHistoryResponse; 

    // Getters and setters 
} 

そして、要素クラスの1:ここでは私のクラスです

@SpringBootApplication 
@ComponentScan("com.foo.bar") 
public class WsApp extends WebMvcConfigurerAdapter{ 

    public static void main(String[] args) { 
     SpringApplication.run(WsApp.class, args); 
    } 

    /** 
    * Configure the XML as the only return type on requests 
    */ 
    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 

     List<MediaType> mediaTypes = new ArrayList<>(); 
     mediaTypes.add(MediaType.TEXT_XML); 

     XStreamMarshaller xmlMarshaller = new XStreamMarshaller(); 

     MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter(xmlMarshaller); 
     xmlConverter.setSupportedMediaTypes(mediaTypes); 

     converters.add(xmlConverter); 

     super.configureMessageConverters(converters); 
    } 
} 

<com.foo.bar.EventsResponseType11> 
    <getAllEventCodesResponse> 
     <__return> 
     <returnCode>0</returnCode> 
     <returnMessage /> 
     </__return> 
     <results> 
     <eventCodes> 
      <com.foo.bar.EventCodeInfoType> 
       <eventCodeID>1</eventCodeID> 
       <eventCode>1000</eventCode> 
       <eventCodeDesc>Success</eventCodeDesc> 
       <eventCodeIndicator>SUCCESS</eventCodeIndicator> 
       <eventCodeContext>General</eventCodeContext> 
       <createdBy>system</createdBy> 
      </com.foo.bar.EventCodeInfoType> 
     </eventCodes> 
     </results> 
    </getAllEventCodesResponse> 
</com.foo.bar.EventsResponseType11> 

私は自分のアプリケーションを設定していますそして私のコントローラ:

@RestController 
@RequestMapping("/go") 
public class EventService { 
    @RequestMapping(value = "/events", method = RequestMethod.POST) 
    public ResponseEntity<EventsResponseType11> events(@RequestBody EventsRequestType11 request){ 

     EventsResponseType11 responseDoc = eventCodesProxy.invoke(request); 

     return ResponseEntity.ok(responseDoc); 
    } 
} 

私の最初の質問は、マーシャルがそれを持っている要素にパッケージ名を含めるのを止める方法です。

第2に、XSDはフィールドを「リターン」として定義するため、JAXBはフィールド名にアンダースコアを追加しました。そのフィールドの@XmlElement注釈は、これを応答として(返信なし)、応答として(アンダースコアなしで)指定します。

私は運がないXStreamMarshallerの代わりにJAXB Marshallerを使用しようとしました。可能であれば、私はスキーマを変更しないことを選択しました。スキーマは古く、部門間の依存関係がたくさんあるからです。

ご協力いただきありがとうございます。

+0

JAXBアノテーションで何もしないので、まずは 'XStreamMarshaller'の使用を止めます。あなたが今見ているのは基本的にXStreamのデフォルトの動作です。代わりにJAXBマーシャラを使用する必要があります。 –

+0

これは理にかなっていますが、私は疑わしい結果でこのアプローチを試みました。私はXStream Marshallerを 'Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();' \t 'jaxb2Marshaller.setPackagesToScan(" com.xsd.package ");'に置き換え、サービスはJSONを返すだけです。どうして?私はメッセージコンバータを構成してからXMLだけを返すので、これは期待できませんでした。また、トップレベルのオブジェクト 'EventsResponseType11'に' @XmlRootElement'を追加しました。 –

+0

返されるのは要求と要求された戻り値の型によって異なります。次に生成されたクラスは、次に再利用されるときに変更しないでください。追加するのは忘れてしまいます。単純な 'EventsResponseType11'を返す代わりに' JAXBElement'に結果をラップするだけで、 'JAXBElement 'を返します。生成された 'ObjectFactory'には、これを行うためのメソッドがあります。 –

答えて

0

ので試行錯誤の多くの後、私はこの記事につまずいた:

Spring 4 mvc REST XML and JSON response

マイアプリケーションクラス:

@SpringBootApplication 
@ComponentScan("com.foo.bar") 
@EnableWebMvc 
public class WsApp extends WebMvcConfigurerAdapter{ 

    public static void main(String[] args) { 
     SpringApplication.run(WsApp.class, args); 
    } 

    /** 
    * Configure the negotiator to return ONLY XML 
    */ 
    @Override 
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { 
     configurer.favorPathExtension(false). 
      favorParameter(true). 
      parameterName("mediaType"). 
      ignoreAcceptHeader(true). 
      useJaf(false). 
      defaultContentType(MediaType.APPLICATION_XML). 
      mediaType("xml", MediaType.APPLICATION_XML); 
    } 
} 

私はあまりにも幸せではないでしょうその前に述べましたXSDの変更については、@XmlRootElementを追加するためにいくつか調整を加えなければなりませんでした。 JAXBソースの生成を追加のライブラリで変更しようとしましたが、うまくいきませんでした。

関連する問題