2012-10-06 23 views
0

我现在被卡住了。autowire无法在jpa tomcat和jersey xml上工作

首先,我制作了从控制台运行的Java应用程序,它是基于注释的配置。
配置下WORKS当运行FROM CONSOLE配置是配置包

@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() {} 

} 

这是我的根的context.xml其中在src /主/资源包

<?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); 
    } 
} 

上面的代码工作启动时通过Console

下面的代码不起作用

现在我有一个问题,当我想在Tomcat容器中运行它。我正在尝试不同的方式来配置它。
我如何重用Tomcat的JpaConfiguration类和root-context.xml?

这是我目前在我的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> 

我的应用程序-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的不自动装配,并抛出空指针例外 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本地主机的工作原理:8080 /应用/ REST /你好/消息

@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的空指针异常?

+0

你如何获得'AuthResource'的实例?什么叫它以及如何? –

回答

0

我认为你需要添加ContextLoaderListenerweb.xml

<listener> 
    <listener-class> 
     org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 
相关问题