отправка XML на Spring REST сервер возвращает неподдерживаемый тип носителя - PullRequest
7 голосов
/ 09 марта 2010

Я пытаюсь создать простой веб-сервис на основе Spring, который поддерживает «публикацию» с содержимым XML.

Весной я определяю AnnotationMethodHandler:

<bean id="inboundMessageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <util:list>
                <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                    <property name="marshaller" ref="xmlMarshaller"/>
                    <property name="unmarshaller" ref="xmlMarshaller"/>
                </bean>
            </util:list>
        </property>
    </bean>

И XML-маршаллер на основе jaxb:

<bean id="xmlMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="contextPaths">
            <array>
                <value>com.company.schema</value>
            </array>
        </property>
        <property name="schemas">
            <array>
                <value>classpath:core.xsd</value>
            </array>
        </property>
    </bean>

Мой контроллер помечен следующим образом, где «Ресурс» - это класс, автоматически сгенерированный jaxb:

@RequestMapping(method = POST, value = "/resource")
    public Resource createResource(@RequestBody Resource resource) {
       // do work
    }

Результатом вызова веб-службы всегда является «HTTP / 1.1 415 Unsupported Media Type». Вот пример вызова службы:

HttpPost post = new HttpPost(uri);
post.addHeader("Accept", "application/xml");
post.addHeader("Content-Type", "application/xml");

StringEntity entity = new StringEntity(request, "UTF-8");
entity.setContentType("application/xml");
post.setEntity(entity);

Мне кажется, что я устанавливаю правильный тип носителя везде, где это возможно. У кого-нибудь есть идеи?

Редактировать: после дальнейшей отладки создается впечатление, что он никогда не добирается до попытки демонтажа объекта. Я не совсем понимаю черную магию, объясняющую, как AnnotationMethodHandler знает, что что-то типа application / xml должно идти в MarshallingHttpConverter. Кто-нибудь может пролить свет на это?

1 Ответ

6 голосов
/ 09 марта 2010

Наиболее вероятная причина в том, что контекст JAXB не знает, как демаршировать объект Resource.

Имеет ли Resource аннотацию @XMLRootElement? Если нет, то Jaxb2Marshaller не примет параметр, и вы получите ошибку 415. Это делается путем делегирования из Sprng во время выполнения JAXB, Spring на самом деле мало что говорит по этому поводу.

edit : Фактическое приведение данных к параметру @RequestBody выполняется в HandlerMethodInvoker.resolveRequestBody(). Существует довольно много условий, которые должны быть выполнены до того, как будет выполнено сопоставление, включая сопоставление типа MIME и типа класса параметров, и в случае сбоя ведение журнала отсутствует, только HTTP 415. Посмотрите на источник для этого метода. и, что еще лучше, сделайте некоторую удаленную отладку, чтобы увидеть, где логика не работает для вашей установки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...