从@RestController XML 元素返回的 JAXB class 不稳定
JAXB class returned from @RestController XML elements wonky
我正在将一个在 JBoss 上运行的旧应用程序移植到 Spring Boot/Tomcat 并且除了响应 XML 之外几乎所有的东西都在工作。旧代码似乎使用 xmlbeans 生成 XSD 源代码。我已将其更改为使用 JAXB。这是我的 class:
@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
}
和元素之一 classes:
@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
}
这是回复XML:
<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>
我已经配置了我的应用程序:
@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);
}
}
还有我的控制器:
@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);
}
}
所以我的第一个问题是,如何阻止编组器将包名称包含在那些具有包名称的元素上。
其次,由于 XSD 将字段定义为 "return" JAXB 在字段名称中添加了下划线。该字段上的 @XmlElement 注释将此标识为 "Return",这是我想要的响应(没有任何下划线)
我曾尝试使用 JAXB Marshaller 代替 XStreamMarshaller,但没有成功。如果可能的话,我会选择不修改模式,因为它很旧并且有很多部门间的依赖关系。
在此先感谢您的帮助!
经过反复试验,我偶然发现了这个 post:
我的申请class:
@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 源代码生成,但效果并不理想。
我正在将一个在 JBoss 上运行的旧应用程序移植到 Spring Boot/Tomcat 并且除了响应 XML 之外几乎所有的东西都在工作。旧代码似乎使用 xmlbeans 生成 XSD 源代码。我已将其更改为使用 JAXB。这是我的 class:
@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
}
和元素之一 classes:
@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
}
这是回复XML:
<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>
我已经配置了我的应用程序:
@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);
}
}
还有我的控制器:
@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);
}
}
所以我的第一个问题是,如何阻止编组器将包名称包含在那些具有包名称的元素上。
其次,由于 XSD 将字段定义为 "return" JAXB 在字段名称中添加了下划线。该字段上的 @XmlElement 注释将此标识为 "Return",这是我想要的响应(没有任何下划线)
我曾尝试使用 JAXB Marshaller 代替 XStreamMarshaller,但没有成功。如果可能的话,我会选择不修改模式,因为它很旧并且有很多部门间的依赖关系。
在此先感谢您的帮助!
经过反复试验,我偶然发现了这个 post:
我的申请class:
@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 源代码生成,但效果并不理想。