在Jaxb2Marshaller上使用带有packagesToScan属性的JAXBElement时,没有适配器端点

时间:2012-06-07 01:50:53

标签: java spring exception jaxb

我正在使用JAXBElement< ...>因为在给定的XSD(我无法修改)的生成类中缺少 @XmlRootElement 注释,但是Spring仍然给我java.lang.IllegalStateException:没有适配器用于端点[ ...]。 Marshaller的定义如下:

<bean id="marsh" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <propety name="packagesToScan" value="com.foo.*.schemas" />
</bean>

在日志中我可以看到spring已经加载了所有模式,如果我在启动时跟踪到endpointMap,我可以在那里看到它,但是当请求到来时,没有合适的适配器...

任何面对同样的人?

1 个答案:

答案 0 :(得分:0)

我现在可以看到它,如果没有使用 contextPath 属性,那么它在jaxb2marshaller实例中没有设置(为空),并且以下私有方法不能按预期工作:

private boolean supportsInternal(Class<?> clazz, boolean checkForXmlRootElement) {
        if (checkForXmlRootElement && AnnotationUtils.findAnnotation(clazz, XmlRootElement.class) == null) {
            return false;
        }
        if (StringUtils.hasLength(getContextPath())) {  // << -----
            String packageName = ClassUtils.getPackageName(clazz);
            String[] contextPaths = StringUtils.tokenizeToStringArray(getContextPath(), ":");
            for (String contextPath : contextPaths) {
                if (contextPath.equals(packageName)) {
                    return true;
                }
            }
            return false;
        }
        else if (!ObjectUtils.isEmpty(getClassesToBeBound())) {
            return Arrays.asList(getClassesToBeBound()).contains(clazz);
        }
        return false;
    }

所以JAXBElement&lt;&gt;技巧在这里不起作用:(