我想用Hibernate配置Spring应用程序。我尝试了这个:
主要启动方式:
@Configuration @EnableWebMvc public class WebConfig implements WebApplicationInitializer, WebMvcConfigurer { private BasicAuthenticationInterceptor basicAuthenticationInterceptor; @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.removeIf(converter -> converter instanceof MappingJackson2XmlHttpMessageConverter); converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter); converters.add(new MappingJackson2XmlHttpMessageConverter( ((XmlMapper) createObjectMapper(Jackson2ObjectMapperBuilder.xml())) .enable(ToXmlGenerator.Feature.WRITE_XML_DECLARATION))); converters.add(new MappingJackson2HttpMessageConverter( createObjectMapper(Jackson2ObjectMapperBuilder.json()))); } private ObjectMapper createObjectMapper(Jackson2ObjectMapperBuilder builder) { builder.indentOutput(true); builder.modules(new JaxbAnnotationModule()); builder.serializationInclusion(JsonInclude.Include.NON_NULL); builder.defaultUseWrapper(false); return builder.build(); } @Override public void onStartup(ServletContext container) { // Create the 'root' Spring application context AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); rootContext.register(ContextDatasource.class); // Manage the lifecycle of the root application context container.addListener(new ContextLoaderListener(rootContext)); // Create the dispatcher servlet's Spring application context AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); // Register and map the dispatcher servlet ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } @Autowired public void setBasicAuthenticationInterceptor(BasicAuthenticationInterceptor basicAuthenticationInterceptor) { this.basicAuthenticationInterceptor = basicAuthenticationInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(basicAuthenticationInterceptor); } }
从rootContext.register(ContextDatasource.class);以下位置调用的Hibernate配置:
rootContext.register(ContextDatasource.class);
@SpringBootApplication @Configuration @EnableTransactionManagement public class ContextDatasource { @Bean public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() { return new FastJsonHttpMessageConverter(); } @Bean @Autowired public HttpMessageConverters convertersToBeUsed(FastJsonHttpMessageConverter converter) { return new HttpMessageConverters(converter); } @Bean public LocalSessionFactoryBean getSessionFactory() throws NamingException { final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(getDataSource()); sessionFactory.setPackagesToScan(new String[] { "org.datalis.plugin.database.models" }); sessionFactory.setHibernateProperties(hibernateProperties()); return sessionFactory; } @Bean public DataSource getDataSource() throws NamingException { return (DataSource) new JndiTemplate().lookup("java:/global/production_gateway"); } @Bean public PlatformTransactionManager getHibernateTransactionManager() throws NamingException { final HibernateTransactionManager transactionManager = new HibernateTransactionManager(); transactionManager.setSessionFactory(getSessionFactory().getObject()); return transactionManager; } @Bean public PersistenceExceptionTranslationPostProcessor getExceptionTranslation() { return new PersistenceExceptionTranslationPostProcessor(); } private final Properties hibernateProperties() { final Properties hibernateProperties = new Properties(); hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MariaDBDialect"); hibernateProperties.setProperty("hibernate.show_sql", "true"); hibernateProperties.setProperty("hibernate.format_sql", "true"); return hibernateProperties; } }
但是,当我部署WAR文件时,出现错误:
Caused by: java.lang.NoSuchMethodException: org.springframework.boot.autoconfigure.http.HttpMessageConverters$$EnhancerBySpringCGLIB$$1d90bff9.<init>() at java.base/java.lang.Class.getConstructor0(Class.java:3302)
完整的错误堆栈:https : //pastebin.com/x30W2aws
您可以在我错的地方提供建议以及如何解决该问题吗?我是否需要使用其他配置来实现模块启动?
编辑:使用Java 8,代码可以正常工作而没有上述问题。在最新的Java 10中,我遇到了上述异常。您知道我需要做什么配置吗?
根据Spring Boot发行说明,Spring Boot 2.0.1及更高版本支持Java 10。没有依赖项列表,就不可能知道这是否是问题所在,但这似乎是一个不错的起点。
您是否正在运行Boot v2.0.1或更高版本?