Java 何时以及如何在RESTAPI中实例化Springbean
首先,我是Spring Boot的一个相对noob,所以请记住这一点 我有一个restapi,在其中我试图最小化对同一对象的数据库调用,并且我已经确定使用作用域为请求的springbean是我想要的。假设这是正确的,下面是我要做的: 1控制器接收经验证的PhotoImportCommand和DTO命令 光通信控制器 我想做的是以某种方式设置在@UserExistsConstraint中验证的用户的Springbean,并在Http请求中调用的各种方法中引用它,但我不确定如何做到这一点。因为我从来没有真正创建过自己的SpringBean,所以我不知道如何继续。我已经阅读了各种各样的指南,比如,但是仍然不知道如何在我的代码中实现它 任何帮助/示例都将不胜感激。您可以使用@Bean注释Java 何时以及如何在RESTAPI中实例化Springbean,java,spring,rest,spring-boot,spring-bean,Java,Spring,Rest,Spring Boot,Spring Bean,首先,我是Spring Boot的一个相对noob,所以请记住这一点 我有一个restapi,在其中我试图最小化对同一对象的数据库调用,并且我已经确定使用作用域为请求的springbean是我想要的。假设这是正确的,下面是我要做的: 1控制器接收经验证的PhotoImportCommand和DTO命令 光通信控制器 我想做的是以某种方式设置在@UserExistsConstraint中验证的用户的Springbean,并在Http请求中调用的各种方法中引用它,但我不确定如何做到这一点。因为我从来
@Configuration
public class MyConfiguration {
@Bean({"validUser"})
public User validUser() {
User user;
//instantiate user either from DB or anywhere else
return user;
}
然后你就可以得到validUser了
@Component
public class PhotoImportCommandDto extends BaseCommand {
@Autowired
@Qualifier("validUser")
private User validUser;
...
}
我真的不知道如何用Java做注释。无论如何,在Spring中,检查用户是否存在于数据库中是一行代码:
userRepository.findOne(user) == null
这是由项目完成的:
创建一个JPA实体用户
在中设置spring.datasource.url和登录/密码
resources/application.properties
创建此界面:
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
}
请注意,Springbean是任何带注释的@Component类,其中包括原型注释,如Controller、Repository-只需查找注释的内容,它可以在内部使用@Component,也可以从带注释的方法返回@Bean。@Bean只能位于组件或配置类上。通过搜索类路径来注入组件,Bean的注入更加自然
还要注意,注入是在字段或构造函数、工厂方法或setter上指定@Autowired注释。文档建议将必需的依赖项注入构造函数,将非必需的依赖项注入setter
还要注意的是,如果您正在注入到构造函数中,并且它被参数清除了,那么您可以省略@Autowired注释,Spring会解决这个问题
调用它的方法findOne。
因此,您可以执行以下操作之一:
如上所示,将userRepository注入@RestController构造函数。我会那样做的。
将userRepository注入@Service internal@组件类,该类将为您完成这类工作。也许你可以用它来创建一个注释。
p、 使用@PostMapping代替@RequestMappingmethod=RequestMethod.POST
p、 注意:如果您有任何疑问,请转到官方文档页面,只需按CTRL-F键:注意当前单词,它将始终引导您进入最新版本
p、 p.p.s每个Spring项目都有自己的.io网页和快速入门指南,在这里您可以快速查看示例项目,并提供一些解释,希望您什么都不知道
希望有帮助!:
如果你愿意,别忘了将答案标记为已接受。使用Jose的输入,我采取了一些不同的方法 以下是我所做的: 我创建了一个ValidateUser类: 我还创建了一个包装类HttpRequestScopeConfig来捕获所有变量,以便在对api的Http请求过程中使用
@Component
public class HttpRequestScopeConfig {
@Autowired
private ValidatedUser validatedUser;
...
public UserEntity getValidatedUser() {
return validatedUser.getUser();
}
public void setValidatedUser(UserEntity validatedUser) {
this.validatedUser.setUser(validatedUser);
}
...
}
在我的UserExistsConstraintValidator中,它是@UserExistsConstraint的impl,我在httpRequestScopeConfig中设置了ValidateUser:
public class UserExistsConstraintValidator implements ConstraintValidator<UserExistsConstraint, Long> {
//private Log log = LogFactory.getLog(EmailExistsConstraintValidator.class);
@Autowired
private UserCommandService svc;
@Autowired
private HttpRequestScopeConfig httpRequestScope;
@Override
public void initialize(UserExistsConstraint userId) {
}
@Override
public boolean isValid(Long userIdField, ConstraintValidatorContext context) {
try {
UserEntity user = svc.findUserOfAnyStatus((Long) userIdField);
if (user != null) {
httpRequestScope.setValidatedUser(user);
return true;
}
} catch (Exception e) {
//log.error(e);
}
return false;
}
}
现在,我可以在需要时通过自动连接HttpRequestScopeConfig在我的其余服务层中访问这些变量。您应该使用spring数据jpa
private UserRepository userRepository ;
**constructor**(UserRepository ur){
userRepository = ur;
}
@RequestScope
@Component
public class ValidatedUser {
private UserEntity user;
public UserEntity getUser() {
return user;
}
public void setUser(UserEntity user) {
this.user = user;
}
}
@Component
public class HttpRequestScopeConfig {
@Autowired
private ValidatedUser validatedUser;
...
public UserEntity getValidatedUser() {
return validatedUser.getUser();
}
public void setValidatedUser(UserEntity validatedUser) {
this.validatedUser.setUser(validatedUser);
}
...
}
public class UserExistsConstraintValidator implements ConstraintValidator<UserExistsConstraint, Long> {
//private Log log = LogFactory.getLog(EmailExistsConstraintValidator.class);
@Autowired
private UserCommandService svc;
@Autowired
private HttpRequestScopeConfig httpRequestScope;
@Override
public void initialize(UserExistsConstraint userId) {
}
@Override
public boolean isValid(Long userIdField, ConstraintValidatorContext context) {
try {
UserEntity user = svc.findUserOfAnyStatus((Long) userIdField);
if (user != null) {
httpRequestScope.setValidatedUser(user);
return true;
}
} catch (Exception e) {
//log.error(e);
}
return false;
}
}