【问题标题】:Autowired object not instantiated [duplicate]自动装配的对象未实例化[重复]
【发布时间】:2019-07-26 11:50:28
【问题描述】:

我正在尝试做一个简单的应用程序来保存使用 Spring 和 Hibernate 的用户。问题是控制器对象实例为空(我使用的是@Autowired)。

我尝试创建一个 SpringUtils 文件,设置一个 Scope,设置 @ComponentScan,但没有任何效果。

Spring 主应用程序

@SpringBootApplication
@EnableJpaRepositories
@ComponentScan({"com.springprojectdao","com.springprojectc.controller"})
@EntityScan("com.springprojectentity")
public class SpringProjectApplication {
    @Autowired
    static UserController userController; //it's null

    public static void main(String[] args) {
        SpringApplication.run(SpringProjectApplication.class, args);        
        userController.createUser();        
    }
}

控制器

@Controller
public class UserController {
    @Autowired
    private UserDAO userDAO;
    //private UserVO user;

    public UserVO initUser() {
        UserVO user = new UserVO();
        user.setUsername("Charly");
        user.setPassword("alamo8");
        user.setPhone("654789321");
        return user;
     }  

    //@Bean
    public UserVO createUser() {
        UserVO user = initUser();
        userDAO.save(user);
        return null;
    }
}

@Repository
public interface UserDAO extends JpaRepository<UserVO,String> {     

}


@Service
public class UserDAOImpl implements UserDAO {

    @Override
    public <S extends UserVO> S save(S entity) {
    // TODO Auto-generated method stub      
        save(entity);
        return null;

     }
}

SpringUtils

@Component
public class SpringUtils {


    public static ApplicationContext ctx;

    /**
     * Make Spring inject the application context
     * and save it on a static variable,
     * so that it can be accessed from any point in the application. 
     */
    @Autowired
    private void setApplicationContext(ApplicationContext 
       applicationContext) {
        ctx = applicationContext;       
    }

}

这是我得到的错误:

线程“main”中的异常 java.lang.NullPointerException 在 com.springproject.SpringProjectApplication.main(SpringProjectApplication.java)

【问题讨论】:

  • spring 不能自动连接静态字段
  • 为什么不创建一个单例范围的 bean,而不是静态变量?这是假设你想要一个静态变量的原因是你想要在使用你的 UserController 的任何东西之间共享值。

标签: java spring hibernate


【解决方案1】:

在 Springframework 中,我们不能让它成为一个带有静态变量的 Spring bean。因为在类加载器加载静态变量的时候还没有加载Spring上下文。所以类加载器没有正确地将静态类注入 bean 并失败。

    @Autowired
    static UserController userController;

【讨论】:

  • 那我应该如何初始化对象呢?如果我使用任何其他前缀,它会给我错误
  • 而不是静态变量,为什么不只制作一个单例范围的 bean?这是假设你想要一个静态变量的原因是你想要在使用你的 UserController 的任何东西之间共享值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2020-12-27
  • 2014-06-07
  • 2012-06-18
  • 1970-01-01
  • 2017-05-13
相关资源
最近更新 更多