0

我正在使用 JAXBElement<...> 因为在给定 XSD 的生成类中缺少@XmlRootElement注释(我无法修改),但 Spring 仍然给我 java.lang.IllegalStateException: No adapter for endpoint [...]。Marshaller 定义如下:

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

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

有人面临同样的情况吗?

4

1 回答 1

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<> 技巧在这里不起作用:(

于 2012-06-07T01:59:51.177 回答