Dependency injection 如何将bean注入自定义参数解析器?

Dependency injection 如何将bean注入自定义参数解析器?,dependency-injection,spring-boot,autowired,Dependency Injection,Spring Boot,Autowired,您好,我使用spring boot 1.3.2版本。我有一个自定义参数解析器,它的名称是ActiveCustomerArgumentResolver。一切都很好,resolveArgument方法工作正常,但我无法初始化属于自定义参数的服务组件。分解器。生命周期流程是否存在问题?这是我的密码: import org.springframework.beans.factory.annotation.Autowired; //other import statements public class

您好,我使用spring boot 1.3.2版本。我有一个自定义参数解析器,它的名称是
ActiveCustomerArgumentResolver
。一切都很好,
resolveArgument
方法工作正常,但我无法初始化属于自定义参数的服务组件。分解器。生命周期流程是否存在问题?这是我的密码:

import org.springframework.beans.factory.annotation.Autowired;
//other import statements

public class ActiveCustomerArgumentResolver implements HandlerMethodArgumentResolver {

@Autowired
private CustomerService customerService;

@Override
public boolean supportsParameter(MethodParameter parameter) {
    if (parameter.hasParameterAnnotation(ActiveCustomer.class) && parameter.getParameterType().equals(Customer.class))
        return true;
    else
        return false;
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
    Principal userPrincipal = webRequest.getUserPrincipal();
    if (userPrincipal != null) {
        Long customerId = Long.parseLong(userPrincipal.getName()); 
        return customerService.getCustomerById(customerId).orNull(); //customerService is still NULL here, it keeps me getting NullPointerEx.
    } else {
        throw new IllegalArgumentException("No user principal is associated with the current request, yet parameter is annotated with @ActiveUser");
    }
}

}

让弹簧为您创建分解器,使其成为
组件

@Component
public class ActiveCustomerArgumentResolver implements HandlerMethodArgumentResolver {...}
然后将解析器插入您的
网络配置
,而不是简单地使用
新建
,如下所示:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired private ActiveCustomerArgumentResolver activeCustomerArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(activeCustomerArgumentResolver);
    }
}
@EnableWebMvc
@配置
公共类WebConfig扩展了WebMVCConfigureAdapter{
@自动连线专用ActiveCustomerArgumentResolver ActiveCustomerArgumentResolver;
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
ArgumentResolver.add(activeCustomerArgumentResolver);
}
}

让弹簧为您创建分解器,使其成为
组件

@Component
public class ActiveCustomerArgumentResolver implements HandlerMethodArgumentResolver {...}
然后将解析器插入您的
网络配置
,而不是简单地使用
新建
,如下所示:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired private ActiveCustomerArgumentResolver activeCustomerArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(activeCustomerArgumentResolver);
    }
}
@EnableWebMvc
@配置
公共类WebConfig扩展了WebMVCConfigureAdapter{
@自动连线专用ActiveCustomerArgumentResolver ActiveCustomerArgumentResolver;
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
ArgumentResolver.add(activeCustomerArgumentResolver);
}
}

这是我解决问题的方式,不是一般的问题,但对我帮助很大:

Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends WebMvcConfigurerAdapter {

private static final Logger logger = LoggerFactory.getLogger(Application.class);

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(activeCustomerArgumentResolver());
}

@Bean
public ActiveCustomerArgumentResolver activeCustomerArgumentResolver() {
    return new ActiveCustomerArgumentResolver();
}
配置
@启用自动配置
@组件扫描
公共类应用程序扩展WebMVCConfigureAdapter{
私有静态最终记录器Logger=LoggerFactory.getLogger(Application.class);
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
添加(activeCustomerArgumentResolver());
}
@豆子
public-ActiveCustomerArgumentResolver-ActiveCustomerArgumentResolver(){
返回新的ActiveCustomerArgumentResolver();
}

这是我解决问题的方式,不是一般的问题,但对我帮助很大:

Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends WebMvcConfigurerAdapter {

private static final Logger logger = LoggerFactory.getLogger(Application.class);

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(activeCustomerArgumentResolver());
}

@Bean
public ActiveCustomerArgumentResolver activeCustomerArgumentResolver() {
    return new ActiveCustomerArgumentResolver();
}
配置
@启用自动配置
@组件扫描
公共类应用程序扩展WebMVCConfigureAdapter{
私有静态最终记录器Logger=LoggerFactory.getLogger(Application.class);
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
添加(activeCustomerArgumentResolver());
}
@豆子
public-ActiveCustomerArgumentResolver-ActiveCustomerArgumentResolver(){
返回新的ActiveCustomerArgumentResolver();
}

这不起作用,但给了我一个解决方案的线索,我正在添加它。我不确定它为什么对您不起作用…这(或非常接近它的东西)完全解决了我的问题。这不起作用,但给了我一个解决方案的线索,我正在添加它。我不确定它为什么对您不起作用…这(或非常接近它的东西)完全解决了我的问题。