我这里有一个基于 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);
}
}
实体管理器配置:
@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();
}
}
最佳答案
@Configuration -自定义 XML 元素的特定对应物,例如 <tx:annotation-driven>是 @Enable...注释。
为了启用对 @Transactional 的支持你需要注释你的 @Configuration用@EnableTransactionManagement上课:
@Configuration
@PropertySource("classpath:/db.properties")
@EnableTransactionManagement
public class EntityManagerConfig { ... }
另请参阅:
关于java - 如何以编程方式配置 TransactionManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12971007/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht