2016-06-27 7 views
3

Я хочу интегрировать Spring 4 с Thymeleaf, но я получил:Не удалось создать экземпляр [org.thymeleaf.templateresolver.ServletContextTemplateResolver]: конструктор по умолчанию не найден

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'templateResolver' defined in ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.thymeleaf.templateresolver.ServletContextTemplateResolver]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.thymeleaf.templateresolver.ServletContextTemplateResolver.<init>() 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1105) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1050) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:633) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:681) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:552) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4914) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5201) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) 
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1648) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) 
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) 
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) 
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:463) 
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:413) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) 
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) 
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) 
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1470) 
    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) 
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1311) 
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1403) 
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:832) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323) 
    at sun.rmi.transport.Transport$1.run(Transport.java:200) 
    at sun.rmi.transport.Transport$1.run(Transport.java:197) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$255(TCPTransport.java:683) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$1/628747463.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.thymeleaf.templateresolver.ServletContextTemplateResolver]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.thymeleaf.templateresolver.ServletContextTemplateResolver.<init>() 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:85) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1098) 
    ... 66 more 
Caused by: java.lang.NoSuchMethodException: org.thymeleaf.templateresolver.ServletContextTemplateResolver.<init>() 
    at java.lang.Class.getConstructor0(Class.java:3082) 
    at java.lang.Class.getDeclaredConstructor(Class.java:2178) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80) 
    ... 67 more 

Я нашел эту тему: Error creating bean with name 'templateResolver', но я с использованием Maven и у меня есть зависимости для Thymeleaf-Spring4 и сам Thymeleaf:

<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf --> 
<dependency> 
    <groupId>org.thymeleaf</groupId> 
    <artifactId>thymeleaf</artifactId> 
    <version>3.0.0.RELEASE</version> 
</dependency> 
<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring4 --> 
<dependency> 
    <groupId>org.thymeleaf</groupId> 
    <artifactId>thymeleaf-spring4</artifactId> 
    <version>3.0.0.RELEASE</version> 
</dependency> 

Я создаю фасоль в mvc-dispatcher-servlent.xml так:

<bean 
    id="viewResolver" 
    class="org.thymeleaf.spring4.view.ThymeleafViewResolver" 
> 
</bean> 
<bean 
    id="templateResolver" 
    class="org.thymeleaf.templateresolver.ServletContextTemplateResolver" 
> 
</bean> 
<bean 
    id="templateEngine" 
    class="org.thymeleaf.spring4.SpringTemplateEngine" 
    p:templateResolver-ref="templateResolver" 
> 
</bean> 

Также было что-то странное в IntelliJ IDEA 2016.2 EAP Я думаю, потому что у меня есть завершение для отсутствия org.thymeleaf.templateresolver.ServletContextTemplateResolver. Кто-нибудь видит ошибку, которую я делаю? Заранее благодарю за каждый ответ. Я нашел решение, потому что распознаватель нужен аргумент в конструктор, я должен создать ServletContextFactory (как в How to set ServletContext property for a bean in Spring XML metadata configuration) и ввести его в конструктор RESOLVER в:

<bean 
    id="servletContext" 
    class="beans.ServletContextFactory" 
></bean> 

<bean 
    id="templateResolver" 
    class="org.thymeleaf.templateresolver.ServletContextTemplateResolver" 
    p:prefix="/WEB-INF/templates/" 
    p:suffix=".html" 
    p:templateMode="HTML5" 

> 
    <constructor-arg ref="servletContext"/> 
</bean> 

ответ

2

Вам нужно будет подключить в вашем templateEngine к viewResolver. Вот мой работает один:

<bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver"> 
    <property name="order" value="1"/> 
    <property name="characterEncoding" value="UTF-8"/> 
    <property name="templateEngine" ref="templateEngine"/> <!-- THIS --> 
</bean> 

<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"> 
    <property name="templateResolvers"> 
     <set> 
      <ref bean="webTemplateResolver"/> 
     </set> 
    </property> 
    <property name="additionalDialects"> 
     <set> 
      <bean class="org.thymeleaf.extras.springsecurity4.dialect.SpringSecurityDialect"/> 
     </set> 
    </property> 
</bean> 
+0

Я нашел решение (я обновил вопрос), но спасибо вы очень за свое внимание :) –

6

Short
Заменить ThymeleafViewResolver с SpringResourceTemplateResolver:

<bean 
    id="templateResolver" 
    class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver" 
    p:prefix="/WEB-INF/templates/" 
    p:suffix=".html" 
    p:templateMode="HTML5" 
> 
</bean> 

Длинные
Несколько дней назад у меня была такая же проблема при использовании Tutorial: Thymeleaf + Spring, то немного устарел. Решение было найдено в "Thymeleaf 3 ten-minute migration guide":

Первое различие в конфигурации Thymeleaf 2 является то, что в настоящее время рекомендуемый шаблон распознаватель для Spring приложений SpringResourceTemplateResolver

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