Nano Hash - криптовалюты, майнинг, программирование

Переключение между JSON (процессор Джексона) и XML (XStream) или я могу использовать их одновременно?

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

это...

@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? локальный: 8080/весна-json/sometestclass/статус? 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.

В чем проблема, с которой я столкнулся?

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

19.09.2011

  • Возможно, вы захотите немного переформулировать вопрос; интерфейсы JSON также могут быть интерфейсами REST... так что, возможно, вместо этого вы имеете в виду интерфейс XML вместо интерфейса JSON? 20.09.2011
  • Вы правы StaxMan, спасибо! -› отредактировано :) 21.09.2011

Ответы:


1

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

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

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

19.09.2011
  • Привет, спасибо за ответ ... но я не хочу использовать какие-либо заголовки принятия. я хотел бы заставить ответ на определенный тип вывода, такой как JSON/XML, и прочитать что-нибудь о точечной нотации, такой как .xml .json и так далее... или лучше: по умолчанию мой сервер возвращает XML, но если я добавьте .json к URI, он вернет JSON ... возможно ли это? 20.09.2011

  • 2

    Решение:

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

    БЕЗ "@ResponseBody"

    20.09.2011
  • Хорошо. Я не заметил, что у вас было, но это имеет смысл. Аннотация @ResponseBody указывает, что ответ должен обходить разрешение представления. Итак, теперь вы можете переключать представления на основе суффикса? 20.09.2011
  • Да, и с ‹property name=defaultContentType value=application/xml/› я возвращаю XML по умолчанию, но я могу переключиться на JSON, если добавлю .json. 21.09.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..