Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有事务管理器的org.springframework.beans.factory.BeanCreationException_Java_Spring_Spring Mvc_Spring Transactions - Fatal编程技术网

Java 带有事务管理器的org.springframework.beans.factory.BeanCreationException

Java 带有事务管理器的org.springframework.beans.factory.BeanCreationException,java,spring,spring-mvc,spring-transactions,Java,Spring,Spring Mvc,Spring Transactions,我一直在研究Restful应用程序上的SpringMVC,但我很难让它正常工作 我的应用程序具有以下结构: @实体类 @Repository类(使用@Transactional进行查询) @RestfulController类(为了简化,我没有实现服务层) 我想使用@Transactional进行查询,但当我在SpringXML文件中配置服务器启动时,会收到错误消息 WARN : org.springframework.web.context.support.XmlWebApplicatio

我一直在研究Restful应用程序上的SpringMVC,但我很难让它正常工作

我的应用程序具有以下结构:

  • @实体
  • @Repository类(使用@Transactional进行查询)
  • @RestfulController类(为了简化,我没有实现服务层)
我想使用@Transactional进行查询,但当我在SpringXML文件中配置服务器启动时,会收到错误消息

WARN : org.springframework.web.context.support.XmlWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'calendarController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.milo.repository.CalendarRepository br.com.milo.controller.CalendarController.repository; nested exception is java.lang.IllegalArgumentException: Can not set br.com.milo.repository.CalendarRepository field br.com.milo.controller.CalendarController.repository to com.sun.proxy.$Proxy47
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:633)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:681)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:552)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5253)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5543)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
只有在spring配置文件中添加以下配置时,才会发生此错误:

<tx:annotation-driven transaction-manager="transactionManager"/>    
这是我的spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc 
                        http://www.springframework.org/schema/mvc/spring-mvc.xsd
                        http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context 
                        http://www.springframework.org/schema/context/spring-context.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <mvc:annotation-driven />

    <context:component-scan base-package="br.com.milo" />

    <resources mapping="/resources/**" location="/resources/" />
    <resources mapping="/pages/**" location="/pages/" />
    <resources mapping="/login/**" location="/login/" />

    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <beans:property name="messageConverters">
            <beans:list>
                <beans:ref bean="jsonMessageConverter"/>
            </beans:list>
        </beans:property>
    </beans:bean>

    <beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    </beans:bean>   

    <beans:bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <beans:property name="dataSource" ref="dataSource" />
      <beans:property name="packagesToScan" value="br.com.milo" />
      <beans:property name="jpaVendorAdapter">
         <beans:bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
      </beans:property>
      <beans:property name="jpaProperties">
         <beans:props>
            <beans:prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</beans:prop>
         </beans:props>
      </beans:property>
   </beans:bean>

   <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <beans:property name="driverClassName" value="org.postgresql.Driver" />
      <beans:property name="url" value="jdbc:postgresql://localhost:5432/milo" />
      <beans:property name="username" value="123" />
      <beans:property name="password" value="123" />
   </beans:bean>

    <beans:bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <beans:property name="entityManagerFactory" ref="myEmf" />
    </beans:bean>
    <!-- Just when I add this line the error above  is shown -->
    <tx:annotation-driven transaction-manager="transactionManager"/>    
</beans:beans>

org.hibernate.dialogue.PostgreSqlDialogue
这是CalendarController.java类

package br.com.milo.controller;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import br.com.milo.domain.Calendar;
import br.com.milo.domain.Owner;
import br.com.milo.domain.DTO.CalendarMonthDTO;
import br.com.milo.repository.CalendarRepository;
@RestController
@RequestMapping("/rest/calendar")
public class CalendarController {

    private static final Logger logger = LoggerFactory.getLogger(CalendarController.class);

    @Autowired
    private CalendarRepository repository;

    @RequestMapping(value = RestPaths.GET_CALENDAR, method = RequestMethod.GET)
    public @ResponseBody Calendar getCalendar(@PathVariable("id") int id) {
        logger.info("Start Get Calendar. ID=" + id);
        return repository.findById(id);
    }

    @RequestMapping(value = RestPaths.LIST_CALENDARS, method = RequestMethod.GET)
    public @ResponseBody List<Calendar> listCalendars() {
        logger.info("Start List Calendars.");
        List<Calendar> calendars = repository.list();
        return calendars;
    }

    @RequestMapping(value = RestPaths.LIST_CALENDAR_BY_OWNER, method = RequestMethod.GET)
    public @ResponseBody List<Calendar> listByOwner(@RequestBody Owner o) {
        logger.info("Start List Calendars By Owner.");
        List<Calendar> calendars = repository.listByType(o);
        return calendars;
    }

    @RequestMapping(value = RestPaths.UPDATE_CALENDAR, method = RequestMethod.POST)
    public @ResponseBody Calendar updateCalendar(@RequestBody Calendar calendar) {
        logger.info("Start Update Calendar.");
        repository.update(calendar);
        return calendar;
    }

    @RequestMapping(value = RestPaths.INSERT_CALENDAR, method = RequestMethod.POST)
    public @ResponseBody Calendar insertCalendar(@RequestBody Calendar calendar) {
        logger.info("Start Insert Calendar.");
        repository.save(calendar);
        return calendar;
    }

    @RequestMapping(value = RestPaths.DELETE_CALENDAR, method = RequestMethod.PUT)
    public @ResponseBody Calendar deleteCalendar(@PathVariable("id") int calendarId) {
        logger.info("Start delete Calendar.");
        Calendar calendar = repository.findById(calendarId);
        repository.delete(calendar);
        return calendar;
    }

    @RequestMapping(value = RestPaths.LIST_CALENDAR_BY_MONTH, method = RequestMethod.GET)
    public @ResponseBody List<Calendar> listByMonth(@RequestBody CalendarMonthDTO calendarDTO) {
        logger.info("Start List Calendar By Month.");
        List<Calendar> calendars = repository.listByMonth(calendarDTO.getOwner(), calendarDTO.getYear(), calendarDTO.getMonth());
        return calendars;
    }

}
package br.com.milo.repository;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.milo.domain.Calendar;
import br.com.milo.domain.Owner;

@Repository
public class CalendarRepository implements br.com.milo.repository.Repository<Calendar, Owner>{

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    @Transactional
    public void save(Calendar calendar) {
        entityManager.persist(calendar);
    }

    @Override
    @Transactional
    public void update(Calendar calendar) {
        entityManager.merge(calendar);
    }

    @Override
    @Transactional
    public void delete(Integer id) {
        this.delete(this.findById(id));
    }

    @Override
    @Transactional
    public void delete(Calendar calendar){
        entityManager.remove(calendar);
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Calendar> list() {
        Query query = entityManager.createQuery("from Calendar c order by c.calendarDate DESC");
        return query.getResultList();
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Calendar> listByType(Owner o) {

        if(o != null){
            Query query = entityManager.createQuery("from Calendar c join c.ownerList o where o.name = :owner");
            query.setParameter("owner", o.getName());
            return query.getResultList();
        }
        return null;
    }

    @SuppressWarnings("unchecked")
    public List<Calendar> listByMonth(Owner o, int year, int month) {

        if(o != null){
            Query query = entityManager.createQuery("from Calendar c join c.ownerList o "
                + "where o.name = :owner "
                + "and month(e.calendarDate)=:month "
                + "and year(e.calendarDate)=:year");
            query.setParameter("owner", o.getName());
            query.setParameter("month", month);
            query.setParameter("year", year);
            return query.getResultList();
        }
        return null;
    }

    @Override
    public Calendar findById(Integer id) {
        Calendar calendar = entityManager.find(Calendar.class, id);
        return calendar;
    }

}
package br.com.milo.controller;
导入java.util.List;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.web.bind.annotation.PathVariable;
导入org.springframework.web.bind.annotation.RequestBody;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RequestMethod;
导入org.springframework.web.bind.annotation.ResponseBody;
导入org.springframework.web.bind.annotation.RestController;
导入br.com.milo.domain.Calendar;
导入br.com.milo.domain.Owner;
导入br.com.milo.domain.DTO.calendarmonthdo;
导入br.com.milo.repository.CalendarRepository;
@RestController
@请求映射(“/rest/calendar”)
公共类日历控制器{
私有静态最终记录器Logger=LoggerFactory.getLogger(CalendarController.class);
@自动连线
私有日历存储库;
@RequestMapping(value=RestPaths.GET\u日历,method=RequestMethod.GET)
public@ResponseBody Calendar getCalendar(@PathVariable(“id”)int-id){
logger.info(“Start-Get-Calendar.ID=“+ID”);
返回repository.findById(id);
}
@RequestMapping(value=RestPaths.LIST_日历,method=RequestMethod.GET)
public@ResponseBody列表日历(){
logger.info(“开始列表日历”);
列表日历=repository.List();
返回日历;
}
@RequestMapping(值=RestPaths.LIST\u日历由\u所有者提供,方法=RequestMethod.GET)
public@ResponseBody List listByOwner(@RequestBody Owner o){
info(“按所有者列出的开始日历”);
列表日历=repository.listByType(o);
返回日历;
}
@RequestMapping(value=RestPaths.UPDATE\u日历,method=RequestMethod.POST)
public@ResponseBody日历更新日历(@RequestBody日历){
logger.info(“开始更新日历”);
更新(日历);
返回日历;
}
@RequestMapping(value=RestPaths.INSERT\u日历,method=RequestMethod.POST)
public@ResponseBody日历插入日历(@RequestBody日历){
info(“开始插入日历”);
保存(日历);
返回日历;
}
@RequestMapping(value=RestPaths.DELETE\u日历,method=RequestMethod.PUT)
public@ResponseBody Calendar deleteCalendar(@PathVariable(“id”)int calendarId){
info(“开始删除日历”);
Calendar Calendar=repository.findById(calendarId);
删除(日历);
返回日历;
}
@RequestMapping(value=RestPaths.LIST\u CALENDAR\u BY\u MONTH,method=RequestMethod.GET)
public@ResponseBody List listByMonth(@RequestBody CalendarMonthDTO calendarDTO){
logger.info(“按月开始列出日历”);
List calendars=repository.listByMonth(calendarDTO.getOwner()、calendarDTO.getYear()、calendarDTO.getMonth());
返回日历;
}
}
这是CalendarRepository.java类

package br.com.milo.controller;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import br.com.milo.domain.Calendar;
import br.com.milo.domain.Owner;
import br.com.milo.domain.DTO.CalendarMonthDTO;
import br.com.milo.repository.CalendarRepository;
@RestController
@RequestMapping("/rest/calendar")
public class CalendarController {

    private static final Logger logger = LoggerFactory.getLogger(CalendarController.class);

    @Autowired
    private CalendarRepository repository;

    @RequestMapping(value = RestPaths.GET_CALENDAR, method = RequestMethod.GET)
    public @ResponseBody Calendar getCalendar(@PathVariable("id") int id) {
        logger.info("Start Get Calendar. ID=" + id);
        return repository.findById(id);
    }

    @RequestMapping(value = RestPaths.LIST_CALENDARS, method = RequestMethod.GET)
    public @ResponseBody List<Calendar> listCalendars() {
        logger.info("Start List Calendars.");
        List<Calendar> calendars = repository.list();
        return calendars;
    }

    @RequestMapping(value = RestPaths.LIST_CALENDAR_BY_OWNER, method = RequestMethod.GET)
    public @ResponseBody List<Calendar> listByOwner(@RequestBody Owner o) {
        logger.info("Start List Calendars By Owner.");
        List<Calendar> calendars = repository.listByType(o);
        return calendars;
    }

    @RequestMapping(value = RestPaths.UPDATE_CALENDAR, method = RequestMethod.POST)
    public @ResponseBody Calendar updateCalendar(@RequestBody Calendar calendar) {
        logger.info("Start Update Calendar.");
        repository.update(calendar);
        return calendar;
    }

    @RequestMapping(value = RestPaths.INSERT_CALENDAR, method = RequestMethod.POST)
    public @ResponseBody Calendar insertCalendar(@RequestBody Calendar calendar) {
        logger.info("Start Insert Calendar.");
        repository.save(calendar);
        return calendar;
    }

    @RequestMapping(value = RestPaths.DELETE_CALENDAR, method = RequestMethod.PUT)
    public @ResponseBody Calendar deleteCalendar(@PathVariable("id") int calendarId) {
        logger.info("Start delete Calendar.");
        Calendar calendar = repository.findById(calendarId);
        repository.delete(calendar);
        return calendar;
    }

    @RequestMapping(value = RestPaths.LIST_CALENDAR_BY_MONTH, method = RequestMethod.GET)
    public @ResponseBody List<Calendar> listByMonth(@RequestBody CalendarMonthDTO calendarDTO) {
        logger.info("Start List Calendar By Month.");
        List<Calendar> calendars = repository.listByMonth(calendarDTO.getOwner(), calendarDTO.getYear(), calendarDTO.getMonth());
        return calendars;
    }

}
package br.com.milo.repository;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.milo.domain.Calendar;
import br.com.milo.domain.Owner;

@Repository
public class CalendarRepository implements br.com.milo.repository.Repository<Calendar, Owner>{

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    @Transactional
    public void save(Calendar calendar) {
        entityManager.persist(calendar);
    }

    @Override
    @Transactional
    public void update(Calendar calendar) {
        entityManager.merge(calendar);
    }

    @Override
    @Transactional
    public void delete(Integer id) {
        this.delete(this.findById(id));
    }

    @Override
    @Transactional
    public void delete(Calendar calendar){
        entityManager.remove(calendar);
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Calendar> list() {
        Query query = entityManager.createQuery("from Calendar c order by c.calendarDate DESC");
        return query.getResultList();
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Calendar> listByType(Owner o) {

        if(o != null){
            Query query = entityManager.createQuery("from Calendar c join c.ownerList o where o.name = :owner");
            query.setParameter("owner", o.getName());
            return query.getResultList();
        }
        return null;
    }

    @SuppressWarnings("unchecked")
    public List<Calendar> listByMonth(Owner o, int year, int month) {

        if(o != null){
            Query query = entityManager.createQuery("from Calendar c join c.ownerList o "
                + "where o.name = :owner "
                + "and month(e.calendarDate)=:month "
                + "and year(e.calendarDate)=:year");
            query.setParameter("owner", o.getName());
            query.setParameter("month", month);
            query.setParameter("year", year);
            return query.getResultList();
        }
        return null;
    }

    @Override
    public Calendar findById(Integer id) {
        Calendar calendar = entityManager.find(Calendar.class, id);
        return calendar;
    }

}
package br.com.milo.repository;
导入java.util.List;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
导入javax.persistence.Query;
导入org.springframework.stereotype.Repository;
导入org.springframework.transaction.annotation.Transactional;
导入br.com.milo.domain.Calendar;
导入br.com.milo.domain.Owner;
@存储库
公共类CalendarRepository实现了br.com.milo.repository.repository{
@持久上下文
私人实体管理者实体管理者;
@凌驾
@交易的
公共作废保存(日历){
entityManager.persist(日历);
}
@凌驾
@交易的
公共作废更新(日历){
entityManager.merge(日历);
}
@凌驾
@交易的
公共无效删除(整数id){
this.delete(this.findById(id));
}
@凌驾
@交易的
公共作废删除(日历){
entityManager.remove(日历);
}
@凌驾
@抑制警告(“未选中”)
公开名单(){
Query Query=entityManager.createQuery(“根据c.calendarDate DESC从日历c订单”);
返回query.getResultList();
}
@凌驾
@抑制警告(“未选中”)
公共列表listByType(所有者o){
如果(o!=null){
Query Query=entityManager.createQuery(“从日历c加入c.owner列表o其中o.name=:owner”);
setParameter(“所有者”,o.getName());
返回query.getResultList();
}
返回null;
}
@抑制警告(“未选中”)
公共列表listByMonth(所有者o,i
@Autowired
private UserDetailsService myCustomUserDetailsService;
interface CalendarRepository extends br.com.milo.repository.Repository<Calendar, Owner>{
    void save(Calendar calendar);
    void update(Calendar calendar);
    void delete(Integer id);
    ... (and all other methods you need)
}

@Repository
class CalendarRepositoryImpl implements CalendarRepository {
    ... (what you currently have in CalendarRepository)
}

class CalendarController {
    @Autowired
    CalendarRepository repository; // NOT CalendarRepositoryImpl
}