2014-12-02 7 views
5

Ich möchte Gson für Webservices im Frühjahr 4 verwenden. Ich folgte steps in diesem Tutorial.Webservice mit Gson im Frühjahr

SocialGraphUI-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 

    <context:component-scan base-package="socialgraphui.controller" /> 

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

    <mvc:resources mapping="/scripts/**" location="/scripts/" /> 
    <mvc:resources mapping="/styles/**" location="/styles/" /> 
    <mvc:annotation-driven /> 

    <mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="com.example.converter.GsonMessageConverter" /> 
     <bean 
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
        <property name="prefixJson" value="true" /> 
     </bean> 
    </mvc:message-converters> 
    </mvc:annotation-driven> 

</beans> 

GsonMessageConverter.java

public class GsonMessageConverter extends AbstractHttpMessageConverter<Object> 
     implements GenericHttpMessageConverter<Object> { 
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); 
    private Gson _gson; 
    private Type _type = null; 
    private boolean _prefixJson = false; 

    /** 
    * Construct a new {@code GsonMessageConverter} with a default 
    * {@link Gson#Gson() Gson}. 
    */ 
    public GsonMessageConverter() { 
     this(new Gson()); 
    } 

    /** 
    * Construct a new {@code GsonMessageConverter}. 
    * 
    * @param serializeNulls 
    *   true to generate json for null values 
    */ 
    public GsonMessageConverter(boolean serializeNulls) { 
     this(serializeNulls ? new GsonBuilder().serializeNulls().create() 
       : new Gson()); 
    } 

    /** 
    * Construct a new {@code GsonMessageConverter}. 
    * 
    * @param gson 
    *   a customized {@link Gson#Gson() Gson} 
    */ 
    public GsonMessageConverter(Gson gson) { 
     super(new MediaType("application", "json", DEFAULT_CHARSET)); 
     setGson(gson); 
    } 

    /** 
    * Sets the {@code Gson} for this view. If not set, a default 
    * {@link Gson#Gson() Gson} is used. 
    * <p> 
    * Setting a custom-configured {@code Gson} is one way to take further 
    * control of the JSON serialization process. 
    * 
    * @throws IllegalArgumentException 
    *    if gson is null 
    */ 
    public void setGson(Gson gson) { 
     Assert.notNull(gson, "'gson' must not be null"); 
     _gson = gson; 
    } 

    public void setType(Type type) { 
     this._type = type; 
    } 

    public Type getType() { 
     return _type; 
    } 

    /** 
    * Indicates whether the JSON output by this view should be prefixed with 
    * "{} &&". Default is false. 
    * <p> 
    * Prefixing the JSON string in this manner is used to help prevent JSON 
    * Hijacking. The prefix renders the string syntactically invalid as a 
    * script so that it cannot be hijacked. This prefix does not affect the 
    * evaluation of JSON, but if JSON validation is performed on the string, 
    * the prefix would need to be ignored. 
    */ 
    public void setPrefixJson(boolean prefixJson) { 
     this._prefixJson = prefixJson; 
    } 

    @Override 
    public boolean canRead(Class<?> clazz, MediaType mediaType) { 
     return canRead(mediaType); 
    } 

    @Override 
    public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) { 
     return canRead(mediaType); 
    } 

    @Override 
    public boolean canWrite(Class<?> clazz, MediaType mediaType) { 
     return canWrite(mediaType); 
    } 

    @Override 
    protected boolean supports(Class<?> clazz) { 
     // should not be called, since we override canRead/Write instead 
     throw new UnsupportedOperationException(); 
    } 

    /** 
    * Generic types will be processed here. 
    */ 
    @Override 
    public Object read(Type type, Class<?> contextClass, 
      HttpInputMessage inputMessage) 
      throws HttpMessageNotReadableException, IOException { 
     setType(type); 
     return readInternal(null, inputMessage); 
    } 

    @Override 
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) 
      throws IOException, HttpMessageNotReadableException { 

     Reader json = new InputStreamReader(inputMessage.getBody(), 
       getCharset(inputMessage.getHeaders())); 

     try { 
      Type typeOfT = getType(); 
      if (typeOfT != null) { 
       return _gson.fromJson(json, typeOfT); 
      } else { 
       return _gson.fromJson(json, clazz); 
      } 
     } catch (JsonSyntaxException ex) { 
      throw new HttpMessageNotReadableException("Could not read JSON: " 
        + ex.getMessage(), ex); 
     } catch (JsonIOException ex) { 
      throw new HttpMessageNotReadableException("Could not read JSON: " 
        + ex.getMessage(), ex); 
     } catch (JsonParseException ex) { 
      throw new HttpMessageNotReadableException("Could not read JSON: " 
        + ex.getMessage(), ex); 
     } finally { 
      setType(null); 
     } 
    } 

    @Override 
    protected void writeInternal(Object o, HttpOutputMessage outputMessage) 
      throws IOException, HttpMessageNotWritableException { 

     OutputStreamWriter writer = new OutputStreamWriter(
       outputMessage.getBody(), getCharset(outputMessage.getHeaders())); 

     try { 
      if (this._prefixJson) { 
       writer.append("{} && "); 
      } 
      Type typeOfSrc = getType(); 
      if (typeOfSrc != null) { 
       _gson.toJson(o, typeOfSrc, writer); 
      } else { 
       _gson.toJson(o, writer); 
      } 
      writer.close(); 
     } catch (JsonIOException ex) { 
      throw new HttpMessageNotWritableException("Could not write JSON: " 
        + ex.getMessage(), ex); 
     } 
    } 

    // helpers 

    private Charset getCharset(HttpHeaders headers) { 
     if (headers != null && headers.getContentType() != null 
       && headers.getContentType().getCharSet() != null) { 
      return headers.getContentType().getCharSet(); 
     } 
     return DEFAULT_CHARSET; 
    } 

} 

Get-Request-Methode in SocialGraphUI.java. Es gibt einen Objekttest und eine Methode allNodes, die eine Liste von Objekten der Klasse Node zurückgibt, und allEdges gibt eine Liste von Objekten der Klasse Edge zurück.

@RequestMapping(value = "/", method = RequestMethod.GET) 
    public String getNodesAndEdges(ModelMap model) { 

     model.addAttribute("nodes", test.allNodes); 
     model.addAttribute("edges", test.allEdges); 
     return "index"; 
    } 

Ich erhalte diese Fehlermeldungen:

type Exception report 

message Servlet.init() for servlet SocialGraphUI threw exception 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

javax.servlet.ServletException: Servlet.init() for servlet SocialGraphUI threw exception 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    java.lang.Thread.run(Thread.java:745) 
root cause 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mvcUriComponentsContributor': Cannot create inner bean '(inner bean)#1043cc94' of type [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter] while setting bean property 'handlerAdapter'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1043cc94': Cannot create inner bean 'com.example.converter.GsonMessageConverter#0' of type [com.example.converter.GsonMessageConverter] while setting bean property 'messageConverters' with key [0]; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.example.converter.GsonMessageConverter] for bean with name 'com.example.converter.GsonMessageConverter#0' defined in ServletContext resource [/WEB-INF/SocialGraphUI-servlet.xml]; nested exception is java.lang.ClassNotFoundException: com.example.converter.GsonMessageConverter 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:290) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:684) 
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    java.lang.Thread.run(Thread.java:745) 
root cause 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1043cc94': Cannot create inner bean 'com.example.converter.GsonMessageConverter#0' of type [com.example.converter.GsonMessageConverter] while setting bean property 'messageConverters' with key [0]; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.example.converter.GsonMessageConverter] for bean with name 'com.example.converter.GsonMessageConverter#0' defined in ServletContext resource [/WEB-INF/SocialGraphUI-servlet.xml]; nested exception is java.lang.ClassNotFoundException: com.example.converter.GsonMessageConverter 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:290) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:359) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:157) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:276) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:684) 
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    java.lang.Thread.run(Thread.java:745) 
root cause 

org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.example.converter.GsonMessageConverter] for bean with name 'com.example.converter.GsonMessageConverter#0' defined in ServletContext resource [/WEB-INF/SocialGraphUI-servlet.xml]; nested exception is java.lang.ClassNotFoundException: com.example.converter.GsonMessageConverter 
    org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1325) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:276) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:359) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:157) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:276) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:684) 
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    java.lang.Thread.run(Thread.java:745) 
root cause 

java.lang.ClassNotFoundException: com.example.converter.GsonMessageConverter 
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714) 
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) 
    org.springframework.util.ClassUtils.forName(ClassUtils.java:247) 
    org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:395) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1346) 
    org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1317) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:276) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:359) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:157) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:276) 
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:684) 
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    java.lang.Thread.run(Thread.java:745) 
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.42 logs. 
+0

Wo befindet sich Ihre Klasse: GsonMessageConverter? Hast du das Beispielpaket erstellt? – rhinds

+0

@rhinds danke, du hast recht, ich habe falsch Paketname verwendet – Matt

Antwort

7

Das Hauptproblem hier könnte die doppelte mvc:annotation-driven Erklärung sein.

Aber wie auch immer, Spring 4.1 introduced Gson support so das macht es viel einfacher für Sie, um dies zu erreichen:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:component-scan base-package="cz.ario.socialgraphui.controller" /> 

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

    <mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.GsonHttpMessageConverter" /> 
     <!-- other HttpMessageConverters you need here --> 
     <!-- Also: why adding Jackson's MessageConverter? Gson should pick JSON serialization in this case --> 
    </mvc:message-converters> 
    </mvc:annotation-driven> 


    <mvc:resources mapping="/scripts/**" location="/scripts/" /> 
    <mvc:resources mapping="/styles/**" location="/styles/" /> 

</beans> 

Die gleiche Sache mit einem JavaConfig Beispiel:

@Configuration 
@EnableWebMvc 
@ComponentScan("cz.ario.socialgraphui.controller") 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public InternalResourceViewResolver viewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setPrefix("/WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(new GsonHttpMessageConverter()); 
     // ... 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/scripts/**").addResourceLocations("/scripts/"); 
     registry.addResourceHandler("/styles/**").addResourceLocations("/styles/"); 
    } 
} 

Hinweis: Sie sollten (fast) nie verwenden versionierte XSDs in Ihren XML-Konfigurationsdateien - see this SO question for more details.

+0

Vielen Dank für diese vorteilhafte Antwort. Ich werde mein Kopfgeld in 20 Stunden vergeben (das kann ich nicht früher machen). – Matt