【问题标题】:Spring custom PropertyEditor / Converters not recognized : no matching editors or conversion strategy foundSpring 自定义 PropertyEditor / 转换器无法识别:找不到匹配的编辑器或转换策略
【发布时间】: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


    【解决方案1】:

    我每次使用 BeanWrapperImpl 时都使用这一行来解决我的问题:

    BeanWrapperImpl beanWrapper = new BeanWrapperImpl(request);
    beanWrapper.registerCustomEditor(XMLGregorianCalendar.class, new XmlGregorianCalendarPropertyEditor());
    

    不是最干净的做事方式,但它确实有效。

    另外,小心使用 CustomEditorConfigurer,我没有将 bean 设为静态,它破坏了我的 @Configuration 类中的注释(例如,我不能使用 @Value)。这是 Spring 给我的警告:

    @Bean 方法 ApplicationConfig.customEditorConfigurer 是非静态的,它返回一个可分配给 Spring 的 BeanFactoryPostProcessor 接口的对象。这将导致无法处理方法的声明@Configuration 类中的@Autowired、@Resource 和@PostConstruct 等注解。将“静态”修饰符添加到此方法以避免这些容器生命周期问题;有关完整详细信息,请参阅@Bean javadoc。

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多