Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring在注入参数时尝试实例化接口_Spring_Spring Mvc - Fatal编程技术网

Spring在注入参数时尝试实例化接口

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

我希望你能帮我做这件事

我在web应用程序中使用SpringMVC(3.1.1),面临着一种奇怪的情况。 我有一个简单的@Controller,它利用了ServicioUsuario服务,运行良好:

@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
    包含当前经过身份验证的用户

  • @PathVariable
    用于访问URI模板变量的注释参数。[……]

  • @RequestParam
    用于访问特定Servlet请求参数的注释参数。[……]

  • @RequestHeader
    用于访问特定Servlet请求HTTP头的注释参数。[……]

  • @RequestBody
    用于访问HTTP请求正文的注释参数。[……]

  • @RequestPart
    用于访问“多部分/表单数据”请求部分内容的注释参数。[……]

  • HttpEntity
    访问Servlet请求HTTP头和内容的参数。[……]

  • 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不在这个(相当令人印象深刻的)列表中。为什么要通过控制器方法注入服务?他们从不改变。只需注入它们一次并将它们分配到一个字段就足够了。

根据官方文档,这是控制器方法可以采用的完整列表:

  • 请求或响应对象(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
    包含当前经过身份验证的用户

  • @PathVariable
    用于访问URI模板变量的注释参数。[……]

  • @RequestParam
    用于访问特定Servlet请求参数的注释参数。[……]

  • @RequestHeader
    用于访问特定Servlet请求HTTP头的注释参数。[……]

  • @RequestBody
    用于访问HTTP请求正文的注释参数。[……]

  • @RequestPart
    用于访问“多部分/表单数据”请求部分内容的注释参数。[……]

  • HttpEntity
    访问Servlet请求HTTP头和内容的参数。[……]

  • 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" />