小编典典

自动连线不适用于基于jpa的tomcat和jersey xml

tomcat

我现在被卡住了。

首先,我制作了从控制台运行的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异常?


阅读 228

收藏
2020-06-16

共1个答案

小编典典

我认为您需要将添加ContextLoaderListener到您的web.xml

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
2020-06-16