我正在尝试创建一个新的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);
}
}
我在做什么错了?
答案 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)
您需要满足以下所有条件:
XForm
注释@Component
UserRepository
在XForm
中注释@Autowired
UserRepository
bean和创建逻辑@ComponentScan
中提及XForm
的软件包(确保语法正确)以下示例:
@ComponentScan(basePackages = {
"com.mycompany.app1",
"com.mycompany.app2"
})
从您的描述来看,您似乎做到了前3分。只有最后一个丢失了。