Java 从另一个类调用方法时,自动连线组件null指针异常

Java 从另一个类调用方法时,自动连线组件null指针异常,java,spring,autowired,Java,Spring,Autowired,我有一个带有自动连线组件和方法的类。如果我直接调用该方法,它可以正常工作。但是,如果对该方法的调用来自另一个类,那么在使用Autowired组件的行中会出现java.lang.NullPointerException错误。自动连线组件是充当代理的接口组件。我尝试了接口组件和自动连线组件的不同注释,但仍然出现错误 我不明白,如果直接调用该方法,为什么Autowired组件不为null;如果从另一个类调用,为什么Autowired组件为null 这是接口组件 @FeignClient(name =

我有一个带有自动连线组件和方法的类。如果我直接调用该方法,它可以正常工作。但是,如果对该方法的调用来自另一个类,那么在使用Autowired组件的行中会出现java.lang.NullPointerException错误。自动连线组件是充当代理的接口组件。我尝试了接口组件和自动连线组件的不同注释,但仍然出现错误

我不明白,如果直接调用该方法,为什么Autowired组件不为null;如果从另一个类调用,为什么Autowired组件为null

这是接口组件

@FeignClient(name = "authentication-server", url = "localhost:8010")
public interface AuthenticationProxy {

    @GetMapping("/headers")
    public HttpEntity<String> retrieveHeaders();

    @GetMapping("/auth-token")
    public AuthorizationTokenBean retrieveToken();
@RestController
public class UserController {

    @Autowired
    private AuthenticationProxy authenticationProxy;

    @PostMapping("/user/create")
    public UserResponseBean createUser(ValuesBean userValues) {

        UserCreateRequestBean bodyBean = new UserCreateRequestBean();
        ValuesBean valuesBean = new ValuesBean();

        bodyBean.setValues(userValues); 

        // This line triggers the null pointer error 
        // (only if method called from another class)
        String token = authenticationProxy
            .retrieveToken()
            .getAuthorizationToken();

        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", token);
        headers.add("Content-type", "application/json");
        headers.add("accept", "application/json");

        HttpEntity<Object> requestEntity =
                new HttpEntity<>(bodyBean, headers);

        ResponseEntity<String> responseEntity = new RestTemplate().exchange(
                "https://api.acme.com/user/create",
                HttpMethod.POST,
                requestEntity,
                String.class
        );

        String output = responseEntity.getBody();
        Gson gson = new Gson();
        return gson.fromJson(output,UserResponseBean.class);

    }
}
解决了! 问题是我手动实例化了从外部类调用的组件,而不是自动连接它

@RestController
public class TestController {

    @Autowired
    UsersController usersController;

    @GetMapping("/test/user/create")
    public void testPolicyholderCreate() {

        ValuesBean valuesBean = new ValuesBean();
        valuesBean.setDate_of_birth("1917-05-16");
        valuesBean.setFirst_name("Juan");
        valuesBean.setLast_name("Rulfo");
        valuesBean.setGender("Male");
        valuesBean.setOccupation("Escritor");

    usersController.createUser(valuesBean);

    }
}

首先:这个世界上没有魔法

依赖项注入之所以可能,是因为依赖项注入框架,Spring提供了其中之一

使用以下命令实例化类时:

UserController testUser = new UserController();
您没有使用任何依赖注入框架,只使用纯Java对象实例。 所以你不能期望@Autowired字段被magic填充

下面的代码可以在java对象实例中填充@Autowired字段:

@Autowired private ApplicationContext applicationContext;

但我认为您的目标是使用已经由Spring实例化的UserController,而不是您创建的新实例。因此,下面的代码可能是您真正想要的:

@RestController
public class TestController {

    @Autowired private UserController testUser;

    @GetMapping("/test/user/create")
    public void testUserCreate() {

        ValuesBean valuesBean = new ValuesBean();
        valuesBean.setDate_of_birth("1917-05-16");
        valuesBean.setFirst_name("Juan");
        valuesBean.setLast_name("Rulfo");
        valuesBean.setGender("Male");
        valuesBean.setOccupation("Escritor");

        testUser.createUser(valuesBean);

    }
}

您是否已将@EnableFeignClients添加到应用程序类中?是:@EnableFeignClients(“com.acme.apimmediater.acmetoy”)公共类用户应用程序{public static void main(String[]args){SpringApplication.run(UsersApplication.class,args);}}谢谢,@Mumrah81,您是对的:我必须自动连接我要使用的组件,而是手动创建一个实例
UserController bean = new UserController();
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean( bean );
@RestController
public class TestController {

    @Autowired private UserController testUser;

    @GetMapping("/test/user/create")
    public void testUserCreate() {

        ValuesBean valuesBean = new ValuesBean();
        valuesBean.setDate_of_birth("1917-05-16");
        valuesBean.setFirst_name("Juan");
        valuesBean.setLast_name("Rulfo");
        valuesBean.setGender("Male");
        valuesBean.setOccupation("Escritor");

        testUser.createUser(valuesBean);

    }
}