我现在被卡住了。
首先,我制作了从控制台运行的Java应用程序,它是基于注释的配置。在 CONSOLE中运行 配置时,以下配置工作在config程序包中
@Configuration public class JpaConfiguration { @Value("#{dataSource}") private javax.sql.DataSource dataSource; @Bean public Map<String, Object> jpaProperties() { Map<String, Object> props = new HashMap<String, Object>(); props.put("hibernate.dialect", MySQL5Dialect.class.getName()); props.put("javax.persistence.validation.factory", validator()); props.put("hibernate.ejb.naming_strategy", ImprovedNamingStrategy.class.getName()); return props; } @Bean public LocalValidatorFactoryBean validator() { return new LocalValidatorFactoryBean(); } @Bean public JpaVendorAdapter jpaVendorAdapter() { HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter(); hibernateJpaVendorAdapter.setGenerateDdl(true); hibernateJpaVendorAdapter.setDatabase(Database.MYSQL); hibernateJpaVendorAdapter.setShowSql(false); return hibernateJpaVendorAdapter; } @Bean public PlatformTransactionManager transactionManager() { return new JpaTransactionManager( localContainerEntityManagerFactoryBean().getObject()); } @Bean public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean() { LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean(); lef.setDataSource(this.dataSource); lef.setPackagesToScan("domain"); lef.setJpaPropertyMap(this.jpaProperties()); lef.setJpaVendorAdapter(this.jpaVendorAdapter()); return lef; } } @Configuration @ImportResource("classpath:root-context.xml") @PropertySource("classpath:database.properties") public class DataSourceConfig { public DataSourceConfig() {} }
这是我的root-context.xml,位于src / main / resources包中
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <context:property-placeholder location="classpath:database.properties" /> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" p:driverClass="com.mysql.jdbc.Driver" p:jdbcUrl="${jdbc.url}" p:user="${jdbc.username}" p:password="${jdbc.password}" p:initialPoolSize="0" p:minPoolSize="0" p:maxPoolSize="10" p:maxIdleTime="300" /> <jpa:repositories base-package="domain" /> <tx:annotation-driven transaction-manager="transactionManager" /> </beans>
我的主要方法
public class ConsoleRun { public static void main(String[] args) throws Exception { final Logger log = LoggerFactory .getLogger("ConsoleRun"); log.info("Starting application"); AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.scan("*"); ctx.refresh(); TestDao testDao = ctx.getBean(TestDao.class); testDao.testUsersList(); log.info("========GETTING ALL RESULTS=============="); testDao.testResultsList(); } }
我的服务类,用于访问控制台程序包中的DAO
@Service public class TestDao { static final Logger log = LoggerFactory.getLogger("TestDatabase"); @Autowired private UserDao userDao; @Autowired private ResultDao resultDao; @Autowired private GameDao gameDao; public List<User> testUsersList() { log.info("Getting all users"); List<User> users = userDao.findAll(); for (User u : users) { log.info("User: {}", u); } return users; } public void testResultsList() { List<Result> results = resultDao.findAll(); for (Result r : results) { log.info("Result: {}", r); } } public User findUserById(Long id) { return userDao.findById(id); } }
从控制台启动时,以上代码有效
以下代码无效
现在我想在Tomcat容器中运行它时遇到问题。我正在尝试以其他方式配置它。 如何将我的JpaConfiguration类和root-context.xml重用于Tomcat?
这是我目前在我的web.xml中所拥有的
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Restful Web Application</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/app-config.xml</param-value> </context-param> <servlet> <servlet-name>jersey-serlvet</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>api</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey-serlvet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
我的app-config.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:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <jpa:repositories base-package="domain" /> <context:component-scan base-package="domain,api,config" /> <!-- Weaves in transactional advice around @Transactional methods --> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="dataSource" class="config.DataSourceConfig" /> <bean id="JpaConfiguration" class="config.DataSourceConfig" /> </beans>
这是userDao无法自动装配并引发nullpointer异常 Authresource在api包中 的主要问题
@Component @Path("/auth") public class AuthResource { @Autowired UserDao userDao; @Autowired TestDao testDao; @GET @Path("/users") @Produces(MediaType.APPLICATION_JSON) public List<User> getAllUsers() { return userDao.findAll(); } }
我的其余部分都在工作,我有一个简单的REST服务类,可用于url localhost:8080 / application / rest / hello / message
@Path("/hello") public class HelloResource { @GET @Path("/{param}") public Response getMsg(@PathParam("param") String msg) { String output = "Jersey say : " + msg; return Response.status(200).entity(output).build(); } }
tomcat是否有可能直接从Java配置文件中加载配置?那就是我在app-config.xml <context:component-scan base- package="domain,api,config" /> 中的内容。还有什么地方可能是问题,为什么我在AuthResource类中的userDao得到nullpointer异常?
<context:component-scan base- package="domain,api,config" />
我认为您需要将添加ContextLoaderListener到您的web.xml
ContextLoaderListener
web.xml
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>