Java 无法配置RootConfig和RootWebMvcConfig

Java 无法配置RootConfig和RootWebMvcConfig,java,spring,hibernate,spring-mvc,jpa,Java,Spring,Hibernate,Spring Mvc,Jpa,我正在尝试使用两个servlet配置Spring应用程序: 使用Spring的事务管理和 JPA 为REST端点提供服务的DispatcherServlet 需要相同的事务管理 我下面的当前配置与答案相匹配,但有一点例外。在RootWebMvcConfig中,我导入了RootConfig。我知道这是我在下面收到的错误消息的原因,但是我想了解如何配置它,以便我的web servlet和REST servlet都可以访问根配置。如果省略导入,则会收到异常,指示通过DispatcherServlet访

我正在尝试使用两个servlet配置Spring应用程序:

  • 使用Spring的事务管理和 JPA
  • 为REST端点提供服务的DispatcherServlet 需要相同的事务管理
  • 我下面的当前配置与答案相匹配,但有一点例外。在RootWebMvcConfig中,我导入了RootConfig。我知道这是我在下面收到的错误消息的原因,但是我想了解如何配置它,以便我的web servlet和REST servlet都可以访问根配置。如果省略导入,则会收到异常,指示通过DispatcherServlet访问REST端点时没有正在进行的会话

    HH000436:实体管理器工厂名称(默认值)已注册。如果实体管理器将被集群化或被动化,请为属性“hibernate.ejb.entitymanager_factory_name”指定一个唯一值

    关于如何配置它以便我的web servlet和REST servlet都可以访问根配置文件,有什么建议吗

    示例web.xml:

    <context-param>
            <param-name>contextClass</param-name>
            <param-value>
              org.springframework.web.context.support.AnnotationConfigWebApplicationContext
          </param-value>
        </context-param>
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>my.package.RootConfig</param-value>
        </context-param>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <servlet>
            <servlet-name>mvc-dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextClass</param-name>
                <param-value>
                    org.springframework.web.context.support.AnnotationConfigWebApplicationContext
                </param-value>
            </init-param>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>my.package.RootWebMvcConfig</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>mvc-dispatcher</servlet-name>
            <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>anotherservlet</servlet-name>
            <servlet-class>my.package.AnotherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>anotherservlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    服务类别:

    @Service
    @Transactional(readOnly = true)
    public class MyProjectProvider {
    
        @Autowired
        private EntityToRestPojoMapper mapper; // This is an Orika ConfigurableMapper
        @Autowired
        private MyObjectService service;
    
        public List<MyObjectPojo> getMyObjects() {
            List<MyObject> data = service.findData();       
            List<MyObjectPojo> dataPojos = new ArrayList<MyObjectPojo>();
            mapper.mapAsCollection(data, dataPojos, MyObjectPojo.class);
            return dataPojos;
        }
    }
    
    @服务
    @事务(只读=真)
    公共类MyProjectProvider{
    @自动连线
    私有EntityToRestPojoMapper;//这是一个Orika ConfigurableMapper
    @自动连线
    私人MyObject服务;
    公共列表getMyObjects(){
    列表数据=service.findData();
    List dataPojos=new ArrayList();
    mapper.mapAsCollection(数据,dataPojos,MyObjectPojo.class);
    返回dataPojos;
    }
    }
    
    我不确定您是否需要从RootWebMvcConfig导入RootConfig。Upd oops解决了这个问题,我会将事务性服务移到根web应用上下文。另外请注意,由于Spring中的web应用上下文层次结构,servlet上下文将已经可以访问根web应用上下文中由RootConfig定义的bean。也许您应该在事务不可用的地方发布方法的代码。
    @Service
    @Transactional(readOnly = true)
    public class MyProjectProvider {
    
        @Autowired
        private EntityToRestPojoMapper mapper; // This is an Orika ConfigurableMapper
        @Autowired
        private MyObjectService service;
    
        public List<MyObjectPojo> getMyObjects() {
            List<MyObject> data = service.findData();       
            List<MyObjectPojo> dataPojos = new ArrayList<MyObjectPojo>();
            mapper.mapAsCollection(data, dataPojos, MyObjectPojo.class);
            return dataPojos;
        }
    }