Spring在注入参数时尝试实例化接口
我希望你能帮我做这件事 我在web应用程序中使用SpringMVC(3.1.1),面临着一种奇怪的情况。 我有一个简单的@Controller,它利用了ServicioUsuario服务,运行良好:Spring在注入参数时尝试实例化接口,spring,spring-mvc,Spring,Spring Mvc,我希望你能帮我做这件事 我在web应用程序中使用SpringMVC(3.1.1),面临着一种奇怪的情况。 我有一个简单的@Controller,它利用了ServicioUsuario服务,运行良好: @Controller @RequestMapping("/ajax") public class ControladorAjax extends ControladorGenerico { @Autowired ServicioUsuario servicioUsuario; @R
@Controller
@RequestMapping("/ajax")
public class ControladorAjax extends ControladorGenerico {
@Autowired
ServicioUsuario servicioUsuario;
@RequestMapping("/check")
public ResponseEntity<String> check(@RequestParam String email) {
// Declarations and other operations omitted...
// Use servicioUsuario
servicioUsuario.doStuff();
return response;
}
}
我有以下接口:
com.package
|-> Servicio.java (interface)
|-> ServicioUsuario.java (interface that extends Servicio)
这些类别:
com.package.impl
|-> ServicioImpl.java (implements Servicio)
|-> ServicioUsuarioImpl.java (@Service("servicioUsuario") that extends ServicioImpl implements ServicioUsuario)
并将Spring配置为扫描两个软件包:
<context:component-scan base-package="com.package
com.package.impl" />
为什么Spring试图实例化接口而不是实现类?这是我做错了什么吗?根据官方文档,这是控制器方法的完整列表:
- 请求或响应对象(Servlet API)。[…]例如
或ServletRequest
HttpServletRequest
- 会话对象(Servlet API):类型为
HttpSession
或org.springframework.web.context.request.WebRequest
org.springframework.web.context.request.NativeWebRequest
用于当前请求区域设置[…]java.util.Locale
/java.io.InputStream
用于访问请求的内容。[……]java.io.Reader
/java.io.OutputStream
用于生成响应的内容。[……]java.io.Writer
包含当前经过身份验证的用户java.security.Principal
用于访问URI模板变量的注释参数。[……]@PathVariable
用于访问特定Servlet请求参数的注释参数。[……]@RequestParam
用于访问特定Servlet请求HTTP头的注释参数。[……]@RequestHeader
用于访问HTTP请求正文的注释参数。[……]@RequestBody
用于访问“多部分/表单数据”请求部分内容的注释参数。[……]@RequestPart
访问Servlet请求HTTP头和内容的参数。[……]HttpEntity
/java.util.Map
/org.springframework.ui.Model
[…]org.springframework.ui.ModelMap
[…]org.springframework.web.servlet.mvc.support.RedirectAttributes
- 命令或表单对象将请求参数绑定到bean属性(通过setter)或直接绑定到字段[…]
/org.springframework.validation.Errors
[…]org.springframework.validation.BindingResult
[…]org.springframework.web.bind.support.SessionStatus
[…]org.springframework.web.util.UriComponentsBuilder
- 请求或响应对象(Servlet API)。[…]例如
或ServletRequest
HttpServletRequest
- 会话对象(Servlet API):类型为
HttpSession
或org.springframework.web.context.request.WebRequest
org.springframework.web.context.request.NativeWebRequest
用于当前请求区域设置[…]java.util.Locale
/java.io.InputStream
用于访问请求的内容。[……]java.io.Reader
/java.io.OutputStream
用于生成响应的内容。[……]java.io.Writer
包含当前经过身份验证的用户java.security.Principal
用于访问URI模板变量的注释参数。[……]@PathVariable
用于访问特定Servlet请求参数的注释参数。[……]@RequestParam
用于访问特定Servlet请求HTTP头的注释参数。[……]@RequestHeader
用于访问HTTP请求正文的注释参数。[……]@RequestBody
用于访问“多部分/表单数据”请求部分内容的注释参数。[……]@RequestPart
访问Servlet请求HTTP头和内容的参数。[……]HttpEntity
/java.util.Map
/org.springframework.ui.Model
[…]org.springframework.ui.ModelMap
[…]org.springframework.web.servlet.mvc.support.RedirectAttributes
- 命令或表单对象将请求参数绑定到bean属性(通过setter)或直接绑定到字段[…]
/org.springframework.validation.Errors
[…]org.springframework.validation.BindingResult
[…]org.springframework.web.bind.support.SessionStatus
[…]org.springframework.web.util.UriComponentsBuilder
正如您所看到的,SpringBean不在这个(相当令人印象深刻的)列表中。为什么要通过控制器方法注入服务?他们从不改变。只需注入它们一次并将它们分配给字段就足够了。您不能这样做。SpringMVC控制器方法参数很复杂,您需要阅读Spring文档以了解它们的解释方式。在您的示例中,Spring试图将您的类用作表单支持bean,这需要一个具体的类。您是否尝试了
@Resource
而不是@Autowired
?为什么奇怪的是它不起作用?我认为最原始的方式
<context:component-scan base-package="com.package
com.package.impl" />