Spring autowire在简单的类中不起作用,但在其他地方都起作用

时间:2018-10-28 15:59:01

标签: java spring autowired

我正在尝试创建一个新的X实体,该实体与我的User实体有关系。当某人发布一个新的X实体时,我正在制作一个“ XForm”,以验证结果,等等。如果所有内容都有效,则在“执行”方法中,我试图从 userRepository中查找该用户。 (基于表单中的ID)。

package app.form;

public class XForm {

@Autowired
private UserRepository userRepository;

private long userId;
//[.. other fields + getters and setters]

public X execute() throws Exception {
    X myX= new X();
    Optional<User> user = userRepository.findById(getUserId());
    if (!user.isPresent()) {
        throw new Exception("User not found");
    }
    myX.setUser(user.get());
    return myX;

}

并且userRepository为null。我尝试用@ Component,@ Service等对其进行注释,但它仍然为null。如您所见,我也不打算创建“新的” UserRepository。自动连接存储库可在其他任何地方(在控制器,身份验证处理程序等中)正常工作。

这是控制器:

public ResponseEntity<Object> testNewAction(@RequestBody @Valid XForm form,
                                         BindingResult result) {
    try {
        if (isValid(result)) {
            X myX = form.execute();
            XRepository.save(myX);
            //return success json
        }
        //return form errors json
    } catch (Exception ex) {
        //return exception json
    }
}

基本应用程序类如下所示,我也确保对其进行了扫描(app.form):

@SpringBootApplication
@ComponentScan(basePackages = {"config", "app"})
@EntityScan(basePackages = {"app.entity"})
@EnableJpaRepositories(basePackages = {"config", "app"})
@EnableTransactionManagement
public class Application {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.run(args);
    }
}

我在做什么错了?

3 个答案:

答案 0 :(得分:2)

您的问题是XForm不是作为Spring bean创建的,而是作为普通Java对象创建的。在这种情况下,您可以将类设置为@ Configurable,Spring会在您调用new时实例化该实例。以下是操作方法示例:https://sichernmic.blogspot.com/2015/04/use-of-configurable-annotation.html

答案 1 :(得分:1)

诊断

我已经遇到了完全相同的问题,并且要解决非常令人沮丧的问题。你不明白怎么了。但是我终于弄清楚了问题所在。并不是说Spring无法检测到error[E0597]: borrowed value does not live long enough --> src/lib.rs:63:22 | 63 | let path: &str = get_path().wait().unwrap().as_str(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - temporary value only lives until here | | | temporary value does not live long enough | = note: borrowed value must be valid for the static lifetime... ,不是! Spring会为您创建一个XForm的bean。您可以使用以下代码进行检查:

XForm

问题

真正的问题在于@Bean public CommandLineRunner commandLineRunner(ApplicationContext ctx) { return args -> { System.out.println("Let's inspect the beans provided by Spring:"); String[] beanNames = ctx.getBeanDefinitionNames(); Arrays.sort(beanNames); for (String beanName : beanNames) { System.out.println(beanName); } }; } @RequestBody的工作(在@RequestBody的帮助下)是它告诉MVC控制器使用no-arg构造函数创建HttpMessageConverter的实例,然后使用值调用setter方法。 HTTP POST请求的数量。现在,由于XForm使用no-arg构造函数创建对象,因此从不注入依赖项(在这种情况下为@RequestBody),并且您会获得服务的空指针。

解决方案的种类

您可以尝试做的是,尝试创建另一个增强型构造函数,然后从无参数构造函数中调用它,如下所示:

UserRepository

我不确定这是否行得通,但绝对值得一试。

答案 2 :(得分:0)

您需要满足以下所有条件:

  1. XForm注释@Component
  2. UserRepositoryXForm中注释@Autowired
  3. 在Java配置中,定义UserRepository bean和创建逻辑
  4. 在您的@ComponentScan中提及XForm的软件包(确保语法正确)

以下示例:

@ComponentScan(basePackages = {
    "com.mycompany.app1",
    "com.mycompany.app2"
})

从您的描述来看,您似乎做到了前3分。只有最后一个丢失了。