Java 无法识别Spring自定义属性编辑器/转换器:未找到匹配的编辑器或转换策略

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

我使用Spring的WebServiceGatewaySupport调用SOAP WS,并使用反射来设置请求值。Spring版本是4.2.4.0版本,SpringWS版本是3.0.7.0版本

某些预期属性的类型为XmlGregorianCalendar,因此我为StringXmlGregorianCalendar转换创建了一个自定义XmlGregorianCalendarPropertyEditor:

@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