使用多个参数将特定bean作为参数注入

时间:2014-12-04 23:06:50

标签: java spring spring-mvc

我知道我可以使用@Autowired在类中注入一个bean。

现在我好奇:: 我不希望拥有@Autowired的私人属性。 我在我的控制器中有一个函数,我想在函数中直接注入bean作为参数。 我收到一个错误,说文件和令牌不是bean。

有没有办法自动装配或只注入我需要的bean作为参数?

@Controller
public class SpinalToolboxWebController {

    /*@Autowired
    private FileOperationsService fileOperationsService;


    @Autowired
    private Comparator<String> comparator;

    @Autowired
    private ServerResponse serverResponse;

    @Autowired
    private SoftwareCommunicationService softwareCommunicationService;

    @Autowired
    private StringBuffer stringBuffer;

    @Autowired
    private UserEnvironmentService userEnvironmentService;*/


    @Autowired
    @RequestMapping(value="/upload", method = RequestMethod.POST, produces="application/json")
    public  @ResponseBody
    ServerResponse handleUploadedFiles(@RequestParam(value = "file") MultipartFile file,
                                       @RequestParam(value="token") String token, 
                                       SoftwareCommunicationService softwareCommunicationService,
                                       FileOperationsService fileOperationsService, 
                                       ServerResponse serverResponse )throws IOException {

        System.out.println("Passing throught upload controller");

        if(!fileOperationsService.isUploadedFileExtensionAllowed(file.getOriginalFilename()))
        {
            serverResponse.setUndefinedResponse();
            return serverResponse;
        }

        if(fileOperationsService.uploadFile(file, token)){
            serverResponse.setResponse(file, softwareCommunicationService.generateRawAndHeader(file));
        }
        else{
            serverResponse.setUndefinedResponse();
        }
        return serverResponse;
    }

}

1 个答案:

答案 0 :(得分:3)

作为内置功能,没有。你不能做你的建议。

但是,Spring提供了自己编写此功能的工具。您需要提出标记注释类型。像@MethodBean这样的东西。您可以注释要从ApplicationContext注入的处理程序方法参数。然后,您需要编写一个扩展HandlerMethodArgumentResolver并查找此注释的类。您必须添加一个@Autowired WebApplicationContext字段,从中获取bean并将其提供给方法。

然后,您将此bean注册为我们MVC堆栈的HandlerMethodArgumentResolver的一部分。

当Spring确定它必须在您的示例中调用处理程序方法时,现在看起来像这样

@RequestMapping(value="/upload", method = RequestMethod.POST, produces="application/json")
public @ResponseBody
ServerResponse handleUploadedFiles(@RequestParam(value = "file") MultipartFile file,
                                   @RequestParam(value="token") String token, 
                                   @MethodBean SoftwareCommunicationService softwareCommunicationService,
                                   @MethodBean FileOperationsService fileOperationsService, 
                                   @MethodBean ServerResponse serverResponse )throws IOException {

它将使用适当的HandlerMethodArgumentResolver来解析每个参数的参数。

对于@MethodBean带注释的参数,它将找到您的自定义实现,在注入的WebApplicationContext中查找参数类型的bean,并将其作为参数提供。