2014-11-24 2 views
0

Я использовал весну 3.2.3. как вы видите, он устарел mediaTypes, который мы использовали ранее, для настройки обработки json, представляя ContentNegotiationManager. Звучит здорово. Но меня это раздражает.Весенний запрос, используя список как расширение

У меня есть конфигурации XML, как это:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="contentNegotiationManager"> 
     <bean class="org.springframework.web.accept.ContentNegotiationManager"> 
      <constructor-arg> 
       <bean class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy"> 
        <constructor-arg> 
         <map> 
          <entry key="json" value="application/json" /> 
          <entry key="list" value="application/json" /> 
         </map> 
        </constructor-arg> 
       </bean> 
      </constructor-arg> 
     </bean> 
    </property> 

    <property name="defaultViews"> 
     <list> 
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
     </list> 
    </property> 
</bean> 

Это кажется правильно. Эм, я так думаю. Но когда я отправить запрос на URL, как /product.list, который соответствовал метод:

@RequestMapping(value="/product.list", consumes={"application/json"}, produces= {"application/json"}) 
@ResponseBody 
public Object list(@RequestBody ListProductReq listProductReq) throws BusinessException 

этот метод только принять запрос JSON, все работает отлично, за исключением URL с расширением списка. После долгого следа я обнаружил, что независимо от того, что я настроил в xml, так же, как и то, что я упомянул выше, будет org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy и org.springframework.web.accept.HeaderContentNegotiationStrategy, я не знаю, откуда он пришел, потому что нигде больше не могу установить эти вещи. Отладочная информация, как показано на рисунке ниже.

enter image description here

отладочная информация была захвачена из класса ContentNegotiationManager.

Интересно, если кто-то столкнулся с этой проблемой, любая помощь будет оценена. Благодарю.

ответ

0
<entry key="list" value="application/json" /> 

это недопустимо. Из PathExtensionContentNegotiationStrategy Javadocs:

A ContentNegotiationStrategy, который использует расширение путь к URL , чтобы определить, какие типы носителей запрашиваются. Расширение пути сначала просматривается на карте типов носителей, предоставляемых конструктору . Если это не удается, инфраструктура Java Activation используется как резервный механизм .

.list не является допустимым типом медиа. Его просто шаблон URL.

Изменение @RequestMapping(value="/product.list") к @RequestMapping(value="/product")

Проверьте, если у вас есть действительные библиотеки Джексона в вашем пути к классам.

+0

Привет, Bhaskara, у меня есть библиотеки Jackson в моем пути к классам, и все, что имеет другое расширение, отлично работает, например 'product.update',' product.add' и т. Д. Но расширение списка было отображено на 'text/plain', это основная проблема. И я не знаю, почему. – Royshun

0

Наконец-то я нашел решение для решения проблемы.

Указывая контенту-согласование-менеджер при использовании mvc: annotation-driven, затем установите для параметра favorPathExtension значение false. Проблема будет решена.

<mvc:annotation-driven content-negotiation-manager="negotiationManager"></mvc:annotation-driven> 
<bean id="negotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="favorPathExtension" value="false" /> 
    <property name="ignoreAcceptHeader" value="true" /> 
    <property name="defaultContentType" value="application/json" /> 
    <property name="useJaf" value="false" /> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json" /> 
      <entry key="html" value="text/html" /> 
     </map> 
    </property> 
</bean> 

Спасибо в любом случае.

Смежные вопросы