相关疑难解决方法(0)

Spring-MVC:什么是"上下文"和"命名空间"?

来自XmlWebApplicationContext javadoc:

默认情况下,配置将从"/WEB-INF/applicationContext.xml"获取根上下文,而"/WEB-INF/test-servlet.xml"获取具有命名空间"test-servlet"的上下文(如对于具有servlet-name"test"的DispatcherServlet实例.

Spring语境是什么意思?

什么是根背景?还有哪些其他类型的Spring上下文?

什么是命名空间?

更新:

一些后续问题:

  1. 什么是Spring ApplicationContext - 它是否包含在配置XML文件中定义的bean?

  2. 查看ContextLoaderListener的代码,看起来它加载了配置XML文件中定义的数据.但我的Spring Web应用程序无需定义此侦听器或任何其他侦听器.怎么会这样?

  3. 在什么情况下有多个Spring的DispatcherServlet实例是有意义的?

  4. 根上下文(来自applicationContext.xml的数据)是否适用于DispatcherServlet的每个实例,而其他上下文(例如来自test-servlet.xml的数据)仅适用于相关的DispatcherServlet(即测试)?

spring spring-mvc

41
推荐指数
2
解决办法
2万
查看次数

Spring XML文件配置层次结构帮助/解释

当我第一次开始学习Spring时,在applicationContext.xml文件中配置了一些东西.然后当我开始专门阅读更新版本的spring时,他们都在单独的XML文件中完成了配置,例如myapp-servlet-xml,myapp-security.xml,myapp-service.xml等.在web.xml文件中配置contextConfigLocation.因此,例如,我一直关注的代码就是它的contextConfigLocation:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/myapp-servlet.xml
        /WEB-INF/myapp-data.xml
    </param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

无论如何,最近我遇到了一个配置问题(StackOverflow的帮助人员帮助我弄清楚),这是由于这种分离.这些书中的示例没有applicationContext.xml文件,稍后当我尝试向应用程序添加自动扫描和注释时,这会导致问题.我尝试将所有内容移动到applicationContext.xml中并取消其他文件并解决了问题.没有其他改变,我只是将所有内容都放在applicationContext.xml中.

因此,这与其他人的评论一起使我有理解,即使您没有创建applicationContext.xml,它仍然被使用,并且它是某种配置层次结构的顶级.我希望其他人可以向我解释这一切是如何运作的,因为我没有在任何地方遇到任何解释.

因此,例如,如果我将某些上下文:组件扫描标记放入applicationContext.xml下面的配置文件中,则可能导致某些类无法扫描.那种性质的东西.我不明白优先级和必须去哪里确定应用程序的广泛性等等.如果有人能够清楚地解释它或指向我解释它的资源我会非常感激,谢谢.希望我所要求的是有道理的.

spring

41
推荐指数
1
解决办法
4万
查看次数

在父上下文和子上下文中声明Spring Bean

我有一个spring bean(dao)对象,我通过以下xml在我的ServletContext中实例化:

<bean id="userDao" class="com.company.dao.impl.UserDaoImpl">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
Run Code Online (Sandbox Code Playgroud)

这个bean在我的webapp-servlet.xml文件中声明,并由我的应用程序在ServletContext中使用.

我也在使用SpringSecurity.我的理解是,它在不同的上下文中运行(SecurityContext).

我的应用程序有一个webapp-security.xml,我在其中实例化一个自定义身份验证提供程序.我想使用我的应用程序中使用的我的dao也在我的安全上下文中进行用户查找,但是当我运行时:

<bean id="userAuthenticationProvider" class="com.company.security.UserAuthenticationProvider">
    <property name="userDao" ref="userDao" />
</bean>
Run Code Online (Sandbox Code Playgroud)

我得到错误,说没有这样的bean"userDao".bean在我的其他上下文中声明的bean中自动装配好,但不在我的安全上下文中.根据Spring Docs,我相信web.xml中需要两个单独的上下文

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

<listener>
    <listener-class>
        org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如何才能访问我的SecurityContext中存在于我的ServletContext中的DAO?我的dao是否有范围修饰符,或者我可以在运行时在我的身份验证提供程序中以某种方式获取ServletContext?作为参考,这是我想在我的身份验证提供程序中使用它的方式:

public class UserAuthenticationProvider extends
    AbstractUserDetailsAuthenticationProvider {

    @Override
protected UserDetails retrieveUser(String userName,
        UsernamePasswordAuthenticationToken authenticationToken)
        throws AuthenticationException {

    // use dao here
Run Code Online (Sandbox Code Playgroud)

谢谢你向我解释这个

更新:

继续我的调查,似乎我使用我的daos的DispatcherServlet是一个子上下文,安全上下文在某个更高的位置.因此,父上下文无法看到我的DispatcherServlet中的bean.我认为答案是以某种方式将我的bean声明移动到父应用程序上下文中,但我不知道如何做到这一点.这是我的web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/spring-*.xml
    </param-value>
</context-param>

<listener>
    <listener-class>
        org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>

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

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet> …
Run Code Online (Sandbox Code Playgroud)

security spring servlets ioc-container security-context

24
推荐指数
1
解决办法
3万
查看次数

Spring创建单例的多个实例?

我有一个Spring bean的图表,它们互相自动装配.重度简化的插图:

<context:annotation-config/>
<bean class="Foo"/>
<bean class="Bar"/>
<bean class="Baz"/>

...

public class Foo {
   @Autowired Bar bar;
   @Autowired Baz baz;
}

public class Bar {
   @Autowired Foo foo;
}

public class Baz {
   @Autowired Foo foo;
}
Run Code Online (Sandbox Code Playgroud)

所有这些bean都没有指定范围,这意味着它们是单例(使它们显式单例不会改变任何东西,我已经尝试过了).

问题是在单个应用程序上下文实例化后,实例BarBaz包含不同的实例Foo.怎么会发生这种情况?

我试图创建public no args构造函数,Foo并且已经确认已经多次创建调试Foo.所有这些创作的堆栈跟踪都在这里.

我还尝试为Spring启用调试日志记录,并在所有其他行中获得以下内容:

DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Foo'
DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Foo'
DEBUG …
Run Code Online (Sandbox Code Playgroud)

java singleton spring autowired applicationcontext

16
推荐指数
1
解决办法
2万
查看次数

通用匹配模式('/**')在过滤器链中的其他模式之前定义,导致它们被忽略

Spring Security基本示例给出了此异常.

错误:"通用匹配模式('/**')在过滤器链中的其他模式之前定义,导致它们被忽略.请检查命名空间或FilterChainProxy bean配置中的顺序"

我在同一个问题上查了很多帖子.但找不到任何解决方案.任何人都可以部署一个hello spring security吗?

我使用的是这些版本 - Spring 3.2.0.RELEASE/Spring security 3.2.0.RELEASE/Tomcat 7/Java 1.7.

这是我的代码:

web.xml中

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Spring security sample Web Application</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-context.xml,
            /WEB-INF/security-context.xml</param-value>
    </context-param>

    <!-- Spring security -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

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

    <servlet>
        <servlet-name>spring-dispatcher-servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-context.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring-dispatcher-servlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
Run Code Online (Sandbox Code Playgroud)

弹簧的context.xml

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd">

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user …
Run Code Online (Sandbox Code Playgroud)

spring-security java-7 tomcat7

8
推荐指数
1
解决办法
1万
查看次数

Spring @Transactional注释被忽略了

我的@Transactionnal注释似乎被忽略了.我对Spring容器的初始化没有错误.看起来我的方法还没有被Spring TX框架代理.在执行我的服务方法期间,JDBCTemplate会抛出预期的RuntimeException.问题是JDBC连接没有回滚并且更改是持久的.堆栈跟踪不显示应该包装我的服务方法的代理的任何符号.

编辑:添加了控制器的代码

编辑2:添加了服务的界面

这是我的服务界面.

public interface ApplicationsService {
    public Application getApplicationById(int id);

    public void createApplication(Application application);

    public void createInstance(Application application);

    public Map<Integer, Application> getUserApplications(String username);

    public Application newApplication(String email);
}
Run Code Online (Sandbox Code Playgroud)

这是我的服务.

@Service
public class ApplicationsServiceImpl implements ApplicationsService {
    ...
    @Transactional
    public void createApplication(Application application){
        // Persisting the application.
        applicationDAO.createApplication(application);
        application.setId(
            applicationDAO.findApplicationId(application.getName(), application.getAccount().getEmail())
        );

        // Creating the physical instance.
        createInstance(application);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

Spring Controller负责方法调用.

@Controller
@RequestMapping("/applications")
public class ApplicationsController {
    ...
    @Autowired
    private ApplicationsService applicationsService;
    ...

    @RequestMapping(method=RequestMethod.POST)
    public String …
Run Code Online (Sandbox Code Playgroud)

java spring annotations transactions jdbc

6
推荐指数
1
解决办法
2万
查看次数

根据DispatchServlet使用ContextLoaderListener

我想使用ContextLoaderListener(以便我可以将Spring Beans传递给我的servlet)以及DispatchServlet(Spring MVC).但是,目前我必须将init param传递给这两个类初始值设定项:

<param-name>contextConfigLocation</param-name>
<param-value>
    /WEB-INF/spring/app-config.xml
</param-value>
Run Code Online (Sandbox Code Playgroud)

所以,我对这两个类使用相同的xml.不知道是否会导致我的bean被初始化两次?如果是,我该怎么做才能避免这种情况?

java spring spring-mvc

5
推荐指数
2
解决办法
6730
查看次数

为什么rest-servlet,xml是SpringMVC必须的?

在我看来web.xml,主要配置如下:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-mvc-config.xml
    </param-value>
</context-param>

<filter>
    <filter-name>SetCharacterEncoding</filter-name>
    <filter-class>
        org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>

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

<servlet>
    <servlet-name>rest</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>rest</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

在我的spring-mvc-config.xml,只有2行:

<mvc:annotation-driven />
<import resource="spring.xml" />
Run Code Online (Sandbox Code Playgroud)

接下来,在我看来spring.xml,弹簧配置上有所有东西,没有关于springMVC配置的任何内容.

当我开始这个web应用程序在Tomcat中,它总是抛出FileNotFoundException[WEB-INF /休息-servlet.xml中],之后我添加它,它只是正常工作.

我只想知道web.xml中哪个部分指示在WEB-INF目录中必须有一个rest-servlet.xml.

我用Google搜索了但却一无所获.谁能帮助我?非常感谢!

java rest spring web.xml spring-mvc

2
推荐指数
1
解决办法
6159
查看次数