Java 无法识别Spring自定义属性编辑器/转换器:未找到匹配的编辑器或转换策略
我使用Spring的WebServiceGatewaySupport调用SOAP WS,并使用反射来设置请求值。Spring版本是4.2.4.0版本,SpringWS版本是3.0.7.0版本 某些预期属性的类型为XmlGregorianCalendar,因此我为StringXmlGregorianCalendar转换创建了一个自定义XmlGregorianCalendarPropertyEditor:Java 无法识别Spring自定义属性编辑器/转换器:未找到匹配的编辑器或转换策略,java,spring,web-services,reflection,spring-ws,Java,Spring,Web Services,Reflection,Spring Ws,我使用Spring的WebServiceGatewaySupport调用SOAP WS,并使用反射来设置请求值。Spring版本是4.2.4.0版本,SpringWS版本是3.0.7.0版本 某些预期属性的类型为XmlGregorianCalendar,因此我为StringXmlGregorianCalendar转换创建了一个自定义XmlGregorianCalendarPropertyEditor: @Slf4j public class XmlGregorianCalendarPropert
@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;
}
在反射方面,我在请求类上有一个beanwraperImpl,我只使用它的方法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;
}
@Bean
公共转换ServiceFactoryBean转换ServiceFactoryBean(){
ConversionServiceFactoryBean ConversionServiceFactoryBean=新的ConversionServiceFactoryBean();
Set converters=新的HashSet();
StringToXmlGregorianCalendar StringToXmlGregorianCalendar=新StringToXmlGregorianCalendar();
XmlGregorianCalendarToString XmlGregorianCalendarToString=新的XmlGregorianCalendarToString();
转换器。添加(stringToXmlGregorianCalendar);
添加(xmlGregorianCalendarToString);
setConverters(转换器);
返回转换ServiceFactoryBean;
}
但这也导致了同样的例外。我想我可以通过编程方式使用转换器(使用@Autowired),但这意味着需要更多的代码和不必要的类型检查
提前感谢。每次使用BeanRapperImpl时,我都使用这一行解决了我的问题:
BeanWrapperImpl beanWrapper = new BeanWrapperImpl(request);
beanWrapper.registerCustomEditor(XMLGregorianCalendar.class, new XmlGregorianCalendarPropertyEditor());
这不是最干净的做事方式,但确实有效
另外,请注意CustomEditorConfiguration,我没有使bean成为静态的,它破坏了@Configuration类中的注释(因此我不能使用@Value作为示例)。这是Spring给我的警告:
@Bean方法ApplicationConfig.CustomEditorConfiger是非静态的,返回可分配给Spring的BeanFactoryPostProcessor接口的对象。这将导致无法在方法的声明@Configuration类中处理注释,例如@Autowired、@Resource和@PostConstruct。将“静态”修饰符添加到此方法以避免这些容器生命周期问题;有关完整的详细信息,请参见@Bean javadoc