2016-05-22 4 views
1

Я получаю следующую ошибку при передаче запроса на RestController.XmlBeanDefinitionStoreExceptionException: префикс «beans» для элемента «beans: bean» не связан

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 22 in XML document from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 22; columnNumber: 108; The prefix "beans" for element "beans:bean" is not bound.

org.xml.sax.SAXParseException; lineNumber: 22; columnNumber: 108; The prefix "beans" for element "beans:bean" is not bound.

Вот контроллер:

@RestController 
public class smsController { 

    @RequestMapping(value = "/sendSMS", method = RequestMethod.POST) 
    public void sendMessage(@RequestBody MessageBean msgBean) throws UnsupportedEncodingException { 

     String numbers = msgBean.getNumbers();  
     String message = msgBean.getMessages(); 
    } 
} 

И dispatcher-servlet xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <context:component-scan base-package="com.spring.rest.controllers" /> 
    <mvc:annotation-driven /> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

    <beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     <beans:property name="messageConverters"> 
      <beans:list> 
       <beans:ref bean="jsonMessageConverter"/> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 
</beans> 

баночки по классам:

jackson-annotations-2.3.2.jar 
jackson-databind-2.3.2.jar 
jackson-core-2.3.2.jar 

Я не уверен, что является причиной проблемы , Когда я использую новые банки из jackson 2.7.4, я получаю другую ошибку:

java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonTypeInfo$As

ответ

2

ошибка очевидна и не имеет ничего общего с Джексоном:

The prefix "beans" for element "beans:bean" is not bound.

Это говорит beans префикс или пространство имен не определены. Поскольку beans является пространством имен по умолчанию:

xmlns="http://www.springframework.org/schema/beans" 

Таким образом, вы должны удалить beans: префикс:

<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <beans:property name="messageConverters"> 
     <beans:list> 
      <beans:ref bean="jsonMessageConverter"/> 
     </beans:list> 
    </beans:property> 
</beans:bean> 

Конечный результат будет, как:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonMessageConverter"/> 
     <list> 
    </property> 
</bean> 

Если вы планируете чтобы включить преобразование JSON по этой части конфигурации, я должен сказать, нет необходимости в этом. При наличии соответствующей зависимости от пути к классам Spring MVC автоматически регистрирует необходимые HttpMessageConverter s для преобразования из/в JSON. Таким образом, вы можете удалить эту конфигурацию.

В конце концов, ваш dispatcher-servlet.xml будет иметь следующий вид:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <context:component-scan base-package="com.spring.rest.controllers" /> 
    <mvc:annotation-driven /> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
</beans> 

И слово советы, если вы новичок в Spring Framework, то лучше начать с Spring Boot.

+0

Лучше придерживаться пространства имен по умолчанию, поскольку это упрощает вашу конфигурацию. –

+0

Требуется ли отображение обработчика запросов для джексона? Я довольно новичок в этом. Когда я удалял префикс, он выдает ошибку 'Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: никакой bean с именем 'jsonMessageConverter' не определен' – Satyadev

+0

Если у вас есть зависимость от jackson-databind' на classpth, да, вы можете удалить что. –