私は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を使用しようとしました。可能であれば、私はスキーマを変更しないことを選択しました。スキーマは古く、部門間の依存関係がたくさんあるからです。
ご協力いただきありがとうございます。
JAXBアノテーションで何もしないので、まずは 'XStreamMarshaller'の使用を止めます。あなたが今見ているのは基本的にXStreamのデフォルトの動作です。代わりにJAXBマーシャラを使用する必要があります。 –
これは理にかなっていますが、私は疑わしい結果でこのアプローチを試みました。私はXStream Marshallerを 'Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();' \t 'jaxb2Marshaller.setPackagesToScan(" com.xsd.package ");'に置き換え、サービスはJSONを返すだけです。どうして?私はメッセージコンバータを構成してからXMLだけを返すので、これは期待できませんでした。また、トップレベルのオブジェクト 'EventsResponseType11'に' @XmlRootElement'を追加しました。 –
返されるのは要求と要求された戻り値の型によって異なります。次に生成されたクラスは、次に再利用されるときに変更しないでください。追加するのは忘れてしまいます。単純な 'EventsResponseType11'を返す代わりに' JAXBElement'に結果をラップするだけで、 'JAXBElement'を返します。生成された 'ObjectFactory'には、これを行うためのメソッドがあります。 –