我从Spring MVC XML文件移动到javaconfig。我的数据库XML文件真的让我迷茫了。我不知道如何使Hibernate4工作以及我的JBoss JNDI数据源工作。有人可以告诉我如何使javaconfig类像这种XML一样工作。
这是我的database.xml:
?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"> <context:property-placeholder location="classpath:app.properties" /> <context:component-scan base-package="org.uftwf" /> <tx:annotation-driven transaction-manager="hibernateTransactionManager" /> <jee:jndi-lookup id="dataSource" jndi-name="java:jboss/datasources/mySQLDB" expected-type="javax.sql.DataSource" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="annotatedClasses"> <list> <value>org.uftwf.inquiry.model.MemberInquiryInformation</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}</prop> <prop key="format_sql">${format_sql}</prop> </props> </property> </bean> <bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans>
这是我的javaconfig类:
@Configuration @EnableWebMvc @ComponentScan(basePackages= {"org.uftwf.inquiry"}) @ImportResource("/WEB-INF/spring/root-config.xml") public class WebMVCConfig extends WebMvcConfigurerAdapter { private static final String MESSAGE_SOURCE = "/WEB-INF/classes/messages"; private static final Logger logger = LoggerFactory.getLogger(WebMVCConfig.class); @Value("${jdbc.driverClassName}") private String driverClassName; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Value("${hibernate.dialect}") private String hibernateDialect; @Value("${hibernate.show_sql}") private String hibernateShowSql; @Value("${hibernate.hbm2ddl.auto}") private String hibernateHbm2ddlAuto; @Bean public PropertyPlaceholderConfigurer getPropertyPlaceholderConfigurer() { PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); ppc.setLocation(new ClassPathResource("application.properties")); ppc.setIgnoreUnresolvablePlaceholders(true); return ppc; } @Bean() public DataSource getDataSource() { DriverManagerDataSource ds = new DriverManagerDataSource(); ds.setDriverClassName(driverClassName); ds.setUrl(url); ds.setUsername(username); ds.setPassword(password); return ds; } @Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean(); factoryBean.setDataSource(getDataSource()); factoryBean.setHibernateProperties(getHibernateProperties()); factoryBean.setPackagesToScan("org.uftwf.inquiry.model"); return factoryBean; } @Bean public Properties getHibernateProperties() { Properties hibernateProperties = new Properties(); hibernateProperties.setProperty("hibernate.dialect", hibernateDialect); //hibernateProperties.setProperty("hibernate.show_sql", "true"); //hibernateProperties.setProperty("hibernate.format_sql", "true"); hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "update"); hibernateProperties.setProperty("javax.persistence.validation.mode", "none"); //Audit History flags hibernateProperties.setProperty("org.hibernate.envers.store_data_at_delete", "true"); hibernateProperties.setProperty("org.hibernate.envers.global_with_modified_flag", "true"); return hibernateProperties; } @Bean @Autowired public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { HibernateTransactionManager htm = new HibernateTransactionManager(); htm.setSessionFactory(sessionFactory); return htm; } @Bean public ViewResolver resolver() { UrlBasedViewResolver url = new UrlBasedViewResolver(); url.setPrefix("/WEB-INF/view/"); url.setViewClass(JstlView.class); url.setSuffix(".jsp"); return url; } @Bean(name = "messageSource") public MessageSource configureMessageSource() { logger.debug("setting up message source"); ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); messageSource.setBasename(MESSAGE_SOURCE); messageSource.setCacheSeconds(5); messageSource.setDefaultEncoding("UTF-8"); return messageSource; } @Bean public LocaleResolver localeResolver() { SessionLocaleResolver lr = new SessionLocaleResolver(); lr.setDefaultLocale(Locale.ENGLISH); return lr; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { logger.debug("setting up resource handlers"); registry.addResourceHandler("/resources/").addResourceLocations("/resources/**"); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { logger.debug("configureDefaultServletHandling"); configurer.enable(); } @Override public void addInterceptors(final InterceptorRegistry registry) { registry.addInterceptor(new LocaleChangeInterceptor()); } @Bean public SimpleMappingExceptionResolver simpleMappingExceptionResolver() { SimpleMappingExceptionResolver b = new SimpleMappingExceptionResolver(); Properties mappings = new Properties(); mappings.put("org.springframework.web.servlet.PageNotFound", "p404"); mappings.put("org.springframework.dao.DataAccessException", "dataAccessFailure"); mappings.put("org.springframework.transaction.TransactionException", "dataAccessFailure"); b.setExceptionMappings(mappings); return b; } @Bean public RequestTrackerConfig requestTrackerConfig() { RequestTrackerConfig tr = new RequestTrackerConfig(); tr.setPassword("Waiting#$"); tr.setUrl("https://uftwfrt01-dev.uftmasterad.org/REST/1.0"); tr.setUser("root"); return tr; } }
我认为我缺少的部分如下,但请多检查我的课
<context:property-placeholder location="classpath:app.properties" /> <context:component-scan base-package="org.uftwf" /> <tx:annotation-driven transaction-manager="hibernateTransactionManager" /> <jee:jndi-lookup id="dataSource" jndi-name="java:jboss/datasources/mySQLDB" expected-type="javax.sql.DataSource" />
对于
<tx:annotation-driven transaction-manager="hibernateTransactionManager" />
注释你的配置类,WebMVCConfig与
WebMVCConfig
@EnableTransactionManagement
<context:component-scan base-package="org.uftwf" />
将Package String添加到您的@ComponentScan字段basePackages
@ComponentScan
basePackages
<context:property-placeholder location="classpath:app.properties" />
注释您的Configuration类
@PropertySource(value = "classpath:app.properties")
然后做你的PropertyPlaceholderConfigurer @Bean方法static。
PropertyPlaceholderConfigurer
@Bean
static
<jee:jndi-lookup id="dataSource" jndi-name="java:jboss/datasources/mySQLDB" expected-type="javax.sql.DataSource" />
我想你可以做
@Bean public DataSource dataSource() throws Exception { Context ctx = new InitialContext(); return (DataSource) ctx.lookup("java:jboss/datasources/mySQLDB"); }
无需自动装配会话工厂,只需调用您的@Bean方法
@Bean public HibernateTransactionManager transactionManager() { HibernateTransactionManager htm = new HibernateTransactionManager(); htm.setSessionFactory(sessionFactory()); return htm; }