我希望有人能帮助我,我开始使用Spring MVC。
我有一个java spring MVC Web应用程序,其中包含以下软件包:com.app.controller
,com.app.modelo
,com.app.servicio
,ycom.app.repositorio
。在repositorio
包中,我有UsuarioRepositorio
接口,在servicio
包中,我有UsuarioServicio
类。控制器使用UsuarioServicio
类,这个使用 deUsuarioRepositorio
接口。控制器在其构造函数中初始化UsuarioServicio
对象。运行项目时,它会显示此错误:
尚未部署模块。 有关详细信息,请参阅服务器日志。
[帕亚拉 5.2021.10] [坟墓] [] [javax.enterprise.system.core] [tid: _ThreadID=90 _ThreadName=admin-thread-pool::admin-listener(1)] [timeMillis: 1643303084394] [levelValue: 1000] [[ 加载应用程序时的异常:java.lang.IllegalStateException:ContainerBase.addChild:start:org.apache.catalina.LifecycleException:org.apache.catalina.LifecycleException:java.lang.NoSuchMethodException:com.app.controller.UsuarioController。()]]
UsuarioRepositorio
界面
package com.app.repositorio;
import com.app.modelo.UsuarioModelo;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UsuarioRepositorio extends JpaRepository<UsuarioModelo, Integer>{
Optional<UsuarioModelo> porUsuario(String CodigoUsuario);
Optional<UsuarioModelo> porUsarioEstatus(String CodigoUsuario, boolean EstatusLogeado);
Optional<UsuarioModelo> porUsuarioIntentos(String CodigoUsuario, int CantidadIntentos);
}
UsuarioServicio
类
package com.app.servicio;
import com.app.modelo.UsuarioModelo;
import com.app.repositorio.UsuarioRepositorio;
import org.springframework.stereotype.Service;
@Service
public class UsuarioServicio {
private final UsuarioRepositorio repouser;
public UsuarioServicio(UsuarioRepositorio ru){
repouser = ru;
}
public UsuarioModelo registrarUsuario (String usuario){
if (usuario == null){
return null;
}else{
UsuarioModelo usermodel = new UsuarioModelo();
usermodel.setCodigoUsuario(usuario);
return repouser.save(usermodel);
}
}
public UsuarioModelo autentica(String usuario){
return repouser.porUsuario(usuario).orElse(null);
}
}
Controller
package com.app.controller;
import com.app.modelo.UsuarioModelo;
import com.app.servicio.UsuarioServicio;
import com.app.repositorio.UsuarioRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UsuarioController {
private UsuarioServicio userserv;
public UsuarioController(UsuarioServicio us){
userserv = us;
}
@GetMapping("/index")
public String getLoginPage(Model modelo) {
modelo.addAttribute("loginrequest", new UsuarioModelo());
return "index";
}
@PostMapping("/index")
public String login(@ModelAttribute UsuarioModelo usermod){
UsuarioModelo logeduser = userserv.autentica(usermod.getCodigoUsuario());
logeduser = logeduser == null ? userserv.registrarUsuario(usermod.getCodigoUsuario()) : logeduser;
return logeduser == null ? "error_page" : "redirect:/index";
}
}
我认为错误可能是由于dispatcher-servlet.xml
文件配置错误,因为我从控制器中删除了UsuarioServicio
并且应用程序运行良好
dispatcher-servlet.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!--
Most controllers will use the ControllerClassNameHandlerMapping above, but
for the index controller we are using ParameterizableViewController, so we must
define an explicit mapping for it.
-->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="index.htm">UsuarioController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<!--
The index controller.
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />-->
<bean name="UsuarioController" class="com.app.controller.UsuarioController"/>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0" 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_4_0.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
</web-app>
applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!--bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" /-->
<!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) -->
</beans>
application.properties
spring.datasource.url=jdbc:sqlserver://XXXXXX;databaseName=XXXXX
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.username=XXXXXX
spring.datasource.password=XXXXXX
spring.jpa.properties.hibernate.dialeg = org.hibernate.dialect.sqlserver
我像这样修改了调度程序-servlet:
<bean name="UsuarioController"
class="com.app.controller.UsuarioController">
<constructor-arg type="com.app.servicio.UsuarioServicio"
value="us"/>
</bean>
现在错误是这样的:
加载应用程序时出现异常:java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建在 ServletContext resource [/WEB-INF/dispatcher-servlet.xml] 中定义的名称为"UsuarioController"的 bean 时出错: 通过构造函数参数 0 表示的不满足依赖关系: 无法转换类型 [java.lang.String] 转换为所需类型 [com.app.servicio.UsuarioServicio]:无法将类型"java.lang.String"的值转换为所需类型"com.app.servicio.UsuarioServicio";嵌套异常是java.lang.IllegalStateException:无法将类型'java.lang.String'的值转换为所需的类型'com.app.servicio.UsuarioServicio':找不到匹配的编辑器或转换策略]]
我已经像这样更新了调度程序-servlet.xml文件
<bean name="UsuarioServicio" class="com.app.servicio.UsuarioServicio" id="us"/>
<bean name="UsuarioController" class="com.app.controller.UsuarioController">
<constructor-arg type="com.app.servicio.UsuarioServicio" ref="UsuarioServicio" />
</bean>
像这样
<bean name="UsuarioServicio" class="com.app.servicio.UsuarioServicio" id="us"/>
<bean name="UsuarioController" class="com.app.controller.UsuarioController">
<constructor-arg ref="UsuarioServicio" />
</bean>
两种情况的错误都是没有这个
加载应用程序时的异常:java.lang.IllegalStateException:ContainerBase.addChild:start:org.apache.catalina.LifecycleException:org.apache.catalina.LifecycleException:java.lang.NoSuchMethodException:com.app.servicio.UsuarioServicio。()]]
我像这样修改了调度程序-servlet:
<jpa:repositories base-package="com.app.repositorio"/>
<bean name="UsuarioServicio" class="com.app.servicio.UsuarioServicio" id="us">
<constructor-arg ref="UsuarioRepositorio"/>
</bean>
<bean name="UsuarioController" class="com.app.controller.UsuarioController">
<constructor-arg type="com.app.servicio.UsuarioServicio" ref="UsuarioServicio" />
</bean>
我得到了这个错误
加载应用程序时异常:java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.Lifecycle Exception: org.apache.catalina.Lifecycle Exception: org.xml.sax.SAXParseException; 行号:36; 列数:59;El prefijo "jpa" para el elemento "jpa:repositories" no está enlazado.]]
然后我像这样删除了前缀"jap">
<repositories base-package="com.app.repositorio"/>
<bean name="UsuarioServicio" class="com.app.servicio.UsuarioServicio" id="us">
<constructor-arg ref="UsuarioRepositorio"/>
</bean>
<bean name="UsuarioController" class="com.app.controller.UsuarioController">
<constructor-arg type="com.app.servicio.UsuarioServicio" ref="UsuarioServicio" />
</bean>
错误是这个
加载应用程序时的异常:java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: org.xml.sax.SAXParseException; lineNumber: 36; columnNumber: 55; cvc-complex-type.2.4.a: Se ha encontrado contenido no válido a partir del elemento 'repositories'.Se esperaba uno de '{"http://www.springframework.org/schema/beans":import, "http://www.springframework.org/schema/beans":alias, "http://www.springframework.org/schema/beans":bean, WC[##other:"http://www.springframework.org/schema/beans"], "http://www.springframework.org/schema/beans":beans}'.]]
我做了一些研究,发现在调度程序-servlet 中要做一些配置
调度程序-服务.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:aop="http://www.springframework.org/schema/aop"
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-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/data/jpa https://www.springframework.org/schema/data/jpa/spring-jpa-2.6.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-5.3.xsd" >
<!--
Most controllers will use the ControllerClassNameHandlerMapping above, but
for the index controller we are using ParameterizableViewController, so we must
define an explicit mapping for it.
-->
<mvc:annotation-driven conversion-service="UsuarioServicio"/>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="index.htm">UsuarioController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<!--
The index controller.
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />-->
<context:component-scan base-package="com.app.repositorio" />
<jpa:repositories base-package="com.app.repositorio"/>
<bean id="UsuarioRepositorio" class="com.app.servicio.UsuarioServicio" >
</bean>
<bean id="UsuarioServicio" class="com.app.servicio.UsuarioServicio">
<constructor-arg name="ur" ref="UsuarioRepositorio"/>
</bean>
<bean name="UsuarioController" class="com.app.controller.UsuarioController">
<constructor-arg ref="UsuarioServicio"/>
</bean>
</beans>
现在错误似乎与这一行有关<context:component-scan>
org.xml.sax.SAXParseException; 行号: 46; 列数: 54; cvc-complex-type.2.4.c: El comodín coincidente es estricto, pero no se ha encontrado ninguna declaración para el elemento 'context:component-scan'.
我将这一行@ComponentScan(basePackages = { "com.app.repositorio" }) 添加到 UsuarioRepositorio 接口,现在文件是这个
UsuarioRepositorio interface
package com.app.repositorio;
import com.app.modelo.UsuarioModelo;
import java.util.Optional;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
@ComponentScan(basePackages = { "com.app.repositorio" })
public interface UsuarioRepositorio extends JpaRepository<UsuarioModelo, Integer>{
Optional<UsuarioModelo> porUsuario(String CodigoUsuario);
Optional<UsuarioModelo> porUsarioEstatus(String CodigoUsuario, boolean EstatusLogeado);
Optional<UsuarioModelo> porUsuarioIntentos(String CodigoUsuario, int CantidadIntentos);
}
更正
以下更正按较低级别层到较高层的顺序排列。
更正#1:持久性层:激活Spring Data JPA存储库Bean支持
添加jpa
XML 命名空间:
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
通过添加以下内容更新xsi:schemaLocation
XML 架构位置:
http://www.springframework.org/schema/data/jpa https://www.springframework.org/schema/data/jpa/spring-jpa.xsd
然后添加repositories
元素:
<jpa:repositories base-package="com.app.repositorio" />
结果:
每个 Bean 都注册在从接口名称派生的 Bean 名称下,因此
UserRepository
的接口将在userRepository
下注册。— Spring Data JPA - 参考文档。
因此,这应该为我们的情况提供usuarioRepositorio
豆。
有关更多详细信息和完整示例,请参阅页面:Spring Data JPA - 参考文档。
更正 #2:应用程序服务层:添加UsuarioServicio
bean
使用对usuarioRepositorio
Bean 的引用来表示usuarioServicio
Bean。
<bean id="usuarioServicio" class="com.app.servicio.UsuarioServicio">
<constructor-arg ref="usuarioRepositorio" />
</bean>
请注意用于id
和ref
属性值的大小写:usuarioServicio
、usuarioRepositorio
。
更正#3:集成层:更新UsuarioController
bean
使用对usuarioServicio
Bean 的引用来表示usuarioController
Bean。
<bean id="usuarioController" class="com.app.controller.UsuarioController">
<constructor-arg ref="usuarioServicio" />`
</bean>
请注意用于id
和ref
属性值的大小写:usuarioController
、usuarioServicio
。