0

特定の XSD に対して生成されたクラスに@XmlRootElementアノテーションがないため (これは変更できません)、JAXBElement<...> を使用していますが、Spring はまだ java.lang.IllegalStateException: No adapter for endpoint [...] を提供しています。マーシャラーは次のように定義されます。

<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 インスタンスで設定されておらず (null)、次のプライベート メソッドが期待どおりに機能しないことがわかります。

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 に答える