【发布时间】:2019-08-05 08:56:00
【问题描述】:
我正在使用 Spring 的 WebServiceGatewaySupport 调用 SOAP WS,并使用反射来设置请求值。 Spring 版本是 4.2.4.RELEASE,Spring WS 版本是 3.0.7.RELEASE。
一些预期的属性是 XmlGregorianCalendar 类型,所以我为字符串创建了一个自定义 XmlGregorianCalendarPropertyEditorXmlGregorianCalendar 转换:
@Slf4j
public class XmlGregorianCalendarPropertyEditor extends PropertyEditorSupport {
private SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
@Override
public String getAsText() {
XMLGregorianCalendar xmlGregorianCalendar = (XMLGregorianCalendar) getValue();
if (xmlGregorianCalendar != null) {
df.setTimeZone(xmlGregorianCalendar.toGregorianCalendar().getTimeZone());
return df.format(xmlGregorianCalendar.toGregorianCalendar().getTime());
} else {
return "";
}
}
@Override
public void setAsText(String text) {
if (StringUtils.isBlank(text)) {
setValue(null);
} else {
GregorianCalendar calendar = new GregorianCalendar();
try {
calendar.setTime(df.parse(text));
XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
setValue(xmlGregorianCalendar);
} catch (ParseException e) {
log.error("Error parsing date {}", text);
setValue(null);
} catch (DatatypeConfigurationException e) {
log.error("Error building XmlGregorianCalendar!");
setValue(null);
}
}
}
这段代码可能会更好,我还不能测试它。
我尝试了不同的方法在我的 @Configuration 类中注册我的 PropertyEditor,但都没有奏效。现在是这样的:
@Bean
public CustomEditorConfigurer customEditorConfigurer() {
CustomEditorConfigurer customEditorConfigurer = new CustomEditorConfigurer();
customEditorConfigurer.setCustomEditors(Collections.singletonMap(XMLGregorianCalendar.class, XmlGregorianCalendarPropertyEditor.class));
return customEditorConfigurer;
}
反射方面,我在 Request 类上有一个 BeanWrapperImpl,我只是使用它的方法 setPropertyValue(attributeName, value)。
这是我收到的异常消息:
Failed to convert property value of type [java.lang.String] to required type [javax.xml.datatype.XMLGregorianCalendar] for property 'dateCreationDocument'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [javax.xml.datatype.XMLGregorianCalendar] for property 'dateCreationDocument': no matching editors or conversion strategy found
我还尝试创建两个转换器并将其添加到我的 @Configuration 类中:
@Bean
public ConversionServiceFactoryBean conversionServiceFactoryBean() {
ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean();
Set<Converter> converters = new HashSet<>();
StringToXmlGregorianCalendar stringToXmlGregorianCalendar = new StringToXmlGregorianCalendar();
XmlGregorianCalendarToString xmlGregorianCalendarToString = new XmlGregorianCalendarToString();
converters.add(stringToXmlGregorianCalendar);
converters.add(xmlGregorianCalendarToString);
conversionServiceFactoryBean.setConverters(converters);
return conversionServiceFactoryBean;
}
但这会导致同样的异常。我想我可以以编程方式使用转换器(使用@Autowired),但这意味着更多的代码和不必要的类型检查。
提前致谢。
【问题讨论】:
标签: java spring web-services reflection spring-ws