java.lang.IllegalStateException:没有为范围名称'request'注册的Scope

问题描述 投票:0回答:1

我有一个简单的jsp应用程序,总和2个数字。我有Servlet,Service和NumberStore类,我保留了总和。对于NumberStore类,我使用请求范围和代理。当我尝试提交总和时我有错误 - java.lang.IllegalStateException:没有为范围名称“请求”注册的范围

它适用于O.K.当我不使用代理和请求范围。

我的服务:

public class MainServlet extends HttpServlet {

private NumberService numberService;

@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);
    try (ConfigurableApplicationContext appCtx = new ClassPathXmlApplicationContext("spring/spring-app.xml")) {
        numberService = appCtx.getBean(NumberService.class);
        appCtx.close();
    }
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String aString = request.getParameter("a");
    String bString = request.getParameter("b");
    if (aString != null && bString != null){ // sorry OOP
       long a = Long.valueOf(aString);
       long b = Long.valueOf(bString);
       numberService.applySum(a, b);
       request.setAttribute("sum",numberService.numberPlus());
    }

    request.getRequestDispatcher("/home.jsp").forward(request, response);
}
}

服务:

@Service
public class NumberService {


@Autowired
private NumberStore numberStore;

public NumberStore getNumberStore() {
    return numberStore;
}

public long numberPlus(){
   return numberStore.getSum();
}
public void applySum(Long a, Long b){
    numberStore.setSum(a+b);
}
}

NumberStore CLASS:

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = 
ScopedProxyMode.TARGET_CLASS)
public class NumberStore {
private long sum;

public long getSum() {
    return sum;
}

public void setSum(long sum) {
    this.sum = sum;
}
}

CML Web:

     <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
     http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
     version="3.1">

    <display-name>SpringUkol</display-name>

    <servlet>
    <servlet-name>MainServlet</servlet-name>
    <servlet-class>main.servlet.MainServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
    </servlet>

    <servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern>/app</url-pattern>
    </servlet-mapping>
    <listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
    </listener>

    </web-app>

SPRING-app.xml中:

   <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: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/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">



   <context:component-scan base-package="main.**.model"/>

   <context:component-scan base-package="main.**.service"/>

   </beans>

回到Home.jsp:

<html>
<body>

<form action = "/app" method = "GET">
First number: <input type = "number" name = "a" required="required">
<br />
Second number: <input type = "number" name = "b" required="required" />
<input type = "submit" value = "Submit" />
<br>
Sum is: ${sum}
</form>

</body>
</html>

POM.HML:

            <project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
             http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>CrunchifySpringMVCTutorial</groupId>
        <artifactId>app</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>war</packaging>
        <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.1</version>
            <configuration>

                 <warSourceDirectory>src/main/webapp</warSourceDirectory>
            </configuration>
        </plugin>
    </plugins>
                         </build>
                  <dependencies>

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>2.0.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.1.2.RELEASE</version>
    </dependency>
        <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.2</version>
        <scope>test</scope>
        </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.1.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>5.1.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.1.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
    </dependency>
       </dependencies>
           </project>
java spring servlets dependency-injection
1个回答
0
投票

您需要在web.xml中使用请求侦听器来创建具有“请求”范围的bean

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
© www.soinside.com 2019 - 2024. All rights reserved.