从@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 源代码生成,但效果并不理想。