我在这里有一个基于Spring MVC的应用程序。我的同事(顺便说一句,他不在这里)以编程方式配置它,除了TransactionManager之外,一切似乎都有效。我从未配置过像这样的Spring Web应用程序,我也不知道该做什么,也找不到任何关于如何配置这样的web应用程序的文档。
我只会告诉你'AppInitializer'和'EntityManagerConfig'。
AppInitializer:
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context;
ServletRegistration.Dynamic dispatcherServletRegistration;
FilterRegistration.Dynamic encodingFilterRegistration, compressionFilterRegistration;
Set<SessionTrackingMode> sessionTrackingModes = new HashSet<SessionTrackingMode>();
sessionTrackingModes.add(SessionTrackingMode.SSL);
context = new AnnotationConfigWebApplicationContext();
context.setServletContext(servletContext);
context.scan("de.devbliss.doc");
servletContext.addListener(new ContextLoaderListener(context));
servletContext.addListener(new Log4jConfigListener());
dispatcherServletRegistration = servletContext.addServlet("main", new DispatcherServlet(context));
dispatcherServletRegistration.setLoadOnStartup(1);
dispatcherServletRegistration.addMapping("/*");
encodingFilterRegistration = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
encodingFilterRegistration.setInitParameter("encoding", "UTF-8");
encodingFilterRegistration.setInitParameter("forceEncoding", "true");
encodingFilterRegistration.addMappingForUrlPatterns(null, false, "/*");
compressionFilterRegistration = servletContext.addFilter("compressionFilter", GzipFilter.class);
compressionFilterRegistration.addMappingForUrlPatterns(null, false, "/*");
compressionFilterRegistration = servletContext.addFilter("springSecurityFilterChain",
DelegatingFilterProxy.class);
compressionFilterRegistration.addMappingForUrlPatterns(null, false, "/*");
servletContext.setSessionTrackingModes(sessionTrackingModes);
}
}
EntityManagerConfig:
@Configuration
@PropertySource("classpath:/db.properties")
public class EntityManagerConfig {
@Bean
public DataSource dataSource(Environment env) {
BasicDataSource ds = new BasicDataSource();
ds.setUrl(env.getProperty("url", "localhost"));
ds.setUsername(env.getProperty("user", "blissdoc"));
ds.setPassword(env.getProperty("password", "s3cret"));
return ds;
}
@Bean
@Inject
public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSource);
return factory;
}
@Bean
public HibernateTransactionManager transactionManager(
SessionFactory sessionFactory) {
HibernateTransactionManager tm = new HibernateTransactionManager(
sessionFactory);
return tm;
}
@SuppressWarnings("unchecked")
@Bean
@Inject
public LocalContainerEntityManagerFactoryBean entityManager(
DataSource dataSource, AbstractEnvironment env) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
HibernateJpaDialect jpaDialect = new HibernateJpaDialect();
org.springframework.core.env.PropertySource<?> source;
Iterator<org.springframework.core.env.PropertySource<?>> sources;
// jpaVendorAdapter.setDatabase(Database.MYSQL);
jpaVendorAdapter.setGenerateDdl(true);
jpaVendorAdapter.setShowSql(true);
Properties jpaProperties = new Properties();
sources = env.getPropertySources().iterator();
while (sources.hasNext()) {
source = sources.next();
if (source.getSource() instanceof Map) {
for (Map.Entry<String, String> property : ((Map<String, String>) source
.getSource()).entrySet()) {
jpaProperties.put(property.getKey(), property.getValue());
}
}
}
em.setJpaProperties(jpaProperties);
em.setDataSource(dataSource);
em.setPersistenceUnitName("blissdoc-unit");
em.setPackagesToScan("de.devbliss.doc.model");
em.setJpaDialect(jpaDialect);
em.setJpaVendorAdapter(jpaVendorAdapter);
return em;
}
// @Bean
// @Inject
// public JpaTransactionManager jpaTransactionManager(
// EntityManagerFactory entityManagerFactory) {
// JpaTransactionManager tm = new JpaTransactionManager(
// entityManagerFactory);
// return tm;
// }
@Bean
@Inject
public JpaRepositoryFactory jpaRepositoryFactory(
EntityManagerFactory entityManagerFactory) {
JpaRepositoryFactory factory = new JpaRepositoryFactory(
entityManagerFactory.createEntityManager());
return factory;
}
@Bean
@Inject
public UserRepository userRepository(
JpaRepositoryFactory jpaRepositoryFactory) {
return jpaRepositoryFactory.getRepository(UserRepository.class);
}
@Bean
@Inject
public ProjectRepository projectRepository(
JpaRepositoryFactory jpaRepositoryFactory) {
return jpaRepositoryFactory.getRepository(ProjectRepository.class);
}
}
---更新 PersistenceJPAConfig(以前的EntityManagerConfig):
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:/db.properties")
public class PersistenceJPAConfig {
@Inject
private Environment env;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(dataSource());
factoryBean.setPackagesToScan(new String[] { "de.devbliss.doc" });
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter() {
{
// JPA properties
}
};
factoryBean.setJpaVendorAdapter(vendorAdapter);
return factoryBean;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl(env.getProperty("url", "localhost"));
dataSource.setUsername(env.getProperty("user", "blissdoc"));
dataSource.setPassword(env.getProperty("password", "s3cret"));
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactoryBean()
.getObject());
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
答案 0 :(得分:6)
@Configuration
- <tx:annotation-driven>
等自定义XML元素的特定对应项是@Enable...
注释。
为了支持@Transactional
,您需要使用@Configuration
为@EnableTransactionManagement
课程添加注释:
@Configuration
@PropertySource("classpath:/db.properties")
@EnableTransactionManagement
public class EntityManagerConfig { ... }
另见:
答案 1 :(得分:4)
您是否尝试过TransactionManagementConfigurer
?
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:/db.properties")
public class EntityManagerConfig implements TransactionManagementConfigurer {
...
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return transactionManager();
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager(entityManagerFactory());
transactionManager.setDataSource(dataSource);
transactionManager.setJpaDialect(new HibernateJpaDialect());
return transactionManager;
}
...
}
似乎您正在使用Spring Data JPA,因此我建议您也使用@EnableJpaRepositories("com.your.repositories.package")
自动配置Spring Data Repository。
希望这会有所帮助:)