Переключение между JSON (процессор Джексона) и XML (XStream) или я могу использовать его одновременно? - PullRequest
0 голосов
/ 19 сентября 2011

Я пытаюсь создать веб-сервер, который может сериализовать объект в JSON и XML.Поскольку я интегрировал Джексона (используя пример проекта), я могу получить доступ к JSON-сериализованному объекту через мой интерфейс REST, но я бы тоже хотел получить XML.

this ...

@Controller
@RequestMapping("/main/ajax")
public class AjaxController {

@RequestMapping(value = "/blah", method = RequestMethod.GET, headers = "Accept=application/xml")
public @ResponseBody List<String> blah(@RequestParam(value="input") String input){

            List<String> stringList = new LinkedList<String>();
            stringList.add("i");
            stringList.add("am");
            stringList.add("an");
            stringList.add("json object");
            stringList.add(input);

            return stringList;
    }
 }

с этим запросом:

http://localhost:8080/spring-json/krams/main/ajax/blah?input=foobar

выводит этот вывод:

["i","am","an","json object","foobar"]

Любые подсказки?

ОБНОВЛЕНИЕ # 1: Я реализовалContentNegotiatingViewResolver ...

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="order" value="1" />

  <property name="mediaTypes">
    <map>
      <entry key="json" value="application/json" />
      <entry key="xml" value="application/xml" />
    </map>
  </property>

  <property name="defaultViews">
    <list>

      <!-- JSON View -->
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

      <!-- XML View --> 
      <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
         <constructor-arg>
          <bean class="org.springframework.oxm.xstream.XStreamMarshaller" />
        </constructor-arg>
      </bean>  

    </list>
  </property>

  <property name="ignoreAcceptHeader" value="true" />
</bean>

<!-- If no extension matched, use JSP view -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="order" value="2" />
  <property name="prefix" value="/WEB-INF/jsp/"/>
  <property name="suffix" value=".jsp"/>
</bean>

Как теперь выбрать XML или JSON?localhost: 8080 / spring-json / sometestclass / status?localhost: 8080 / spring-json / sometestclass / status.xml?localhost: 8080 / spring-json / sometestclass / status.json?

Ни один из приведенных выше примеров не работает, но я могу принудительно настроить формат ответа с помощью заголовка Accept "application / xml" или "application /json "... если я сделаю следующее ...

@RequestMapping(value = "/status", method = RequestMethod.GET, headers = "Accept=application/xml, application/json")
public @ResponseBody Web_ServerStatus isServerAlive() {
    Web_ServerStatus l_ReturnObj = new Web_ServerStatus();

... я получу только XML обратно.

В чем проблема, с которой я сталкиваюсь?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Да, взгляните на ContentNegotiatingViewResolver (поскольку вы включили Spring в качестве тега).

Вот ссылка: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-multiple-representations.

Но REST не подразумевает XML. В зависимости от заголовка Accept клиента и возможностей вашего сервиса вы можете отобразить ресурс разными способами.

0 голосов
/ 20 сентября 2011

Решение:

@RequestMapping(value = "/status", method = RequestMethod.GET)
public Web_ServerStatus isServerAlive() {
  ...
}

БЕЗ "@ResponseBody"

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