将WSDL项目迁移至Spring Boot REST时遇类型转换错误求助
解决Spring Boot REST接口XML参数转复杂类型的问题
出现Failed to convert value of type 'java.lang.String' to required type HistComplexType错误,是因为Spring MVC默认无法将URL参数里的XML字符串自动转换为自定义复杂类型HistComplexType,可以通过以下两种方式解决:
方式一:实现全局参数转换器
编写XML转复杂类型的转换器
利用JAXB(原WSDL项目生成的实体类应该已带有@XmlRootElement等JAXB注解)实现字符串到HistComplexType的转换:import org.springframework.core.convert.converter.Converter; import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.Unmarshaller; import java.io.StringReader; public class XmlToHistComplexTypeConverter implements Converter<String, HistComplexType> { @Override public HistComplexType convert(String xmlStr) { try { JAXBContext jaxbContext = JAXBContext.newInstance(HistComplexType.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); return (HistComplexType) unmarshaller.unmarshal(new StringReader(xmlStr)); } catch (Exception e) { throw new IllegalArgumentException("XML格式不符合HistComplexType要求", e); } } }注册转换器到Spring MVC
创建Web配置类,将转换器加入Spring的格式化注册表:import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new XmlToHistComplexTypeConverter()); } }接口方法直接接收复杂类型参数
接口中直接用@RequestParam绑定HistComplexType类型参数即可:@GetMapping("/myendpoint/command") public ResponseEntity<?> processCommand(@RequestParam("command") HistComplexType complexType) { // 执行业务逻辑 return ResponseEntity.ok().build(); }
方式二:方法内手动解析XML字符串
如果不想全局配置转换器,可以在接口方法中先接收字符串参数,再手动转换为复杂类型:
import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.Unmarshaller; import java.io.StringReader; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @GetMapping("/myendpoint/command") public ResponseEntity<?> processCommand(@RequestParam("command") String commandXml) { HistComplexType complexType; try { JAXBContext jaxbContext = JAXBContext.newInstance(HistComplexType.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); complexType = (HistComplexType) unmarshaller.unmarshal(new StringReader(commandXml)); } catch (Exception e) { return ResponseEntity.badRequest().body("无效的XML参数格式"); } // 执行业务逻辑 return ResponseEntity.ok().build(); }
注意事项
- URL中的XML字符串需要URL转义,比如
<替换为%3C,>替换为%3E,&替换为%26,否则会导致请求解析失败。示例转义后的URL:https://someserver:port/myendpoint/command?command=%3Cxml%20version%3D%221.0%22%3E%3CHistComplexType%3E...%3C/HistComplexType%3E
内容的提问来源于stack exchange,提问作者Perry
相关产品推荐
相关产品推荐

