首先,我是Spring Boot的亲戚,所以请记住这一点。
我有一个REST api,其中我正在尝试最小化同一对象的数据库调用,并且我已经确定使用作用于请求的Spring Bean是我想要的。假设这是正确的,这是我正在尝试做的事情:
1)Controller接受经过验证的@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<?> importPhoto(@Valid @RequestBody PhotoImportCommandDto command){
...
}
命令
PhotoCommandController
PhotoImportCommandDto
2)@UserExistsConstraint
已经过验证。请注意自定义@Component
public class PhotoImportCommandDto extends BaseCommand {
@NotNull(message = "userId must not be null!")
@UserExistsConstraint
private Long userId;
...
}
,它通过调用服务方法验证用户是否存在于数据库中。
PhotoImportCommandDto
@UserExistsConstraint
我想要做的是以某种方式设置一个在void Main()
{
int val = 0;
Stack<int> stack = new Stack<int>();
stack.Push(4);
stack.Push(2);
stack.Push(1);
stack.Push(3);
stack.Push(6);
stack.Push(7);
stack.Push(5);
stack.Aggregate((a,b)=>{
if(val == 0){
val = (a > b) ? b : a;
}
else {
val = (a > b) ? ((b >= val) ? val : b) : ((a >= val) ? val : a);
}
return val;
});
Console.WriteLine(val);
}
中验证的用户的Spring Bean,并在可能在整个Http请求中调用的各种方法中引用它,但我不确定怎么做。由于我从未真正创建过自己的Spring Beans,所以我不知道如何继续。我已经阅读了各种指南,例如this,但我仍然迷失在如何在我的代码中实现它。
非常感谢任何帮助/示例。
答案 0 :(得分:1)
您可以使用@Bean
注释。
@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;
...
}
答案 1 :(得分:0)
我真的不知道如何在Java中进行注释。无论如何,在Spring中,检查用户在DataBase中的位置是一行代码:
userRepository.findOne(user) == null
这是由Spring Data JPA
项目完成的:
创建JPA实体User
。
在中设置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> {
}
注意,Spring在幕后实现它。
将此接口注入RestController
(或任何其他Spring bean):
private UserRepository userRepository ;
**constructor**(UserRepository ur){
userRepository = ur;
}
注意,Spring Bean是任何带注释的类@Component
(这包括像Controller
,Repository
这样的构造型注释 - 只需查看注释的内容,它可以使用{{1在内部)或从注释为@Component
的方法返回(只能在@Bean
或Component
类上)。通过搜索类路径注入Configuration
,Component
更自然地注入。
另请注意,Bean
在字段或构造函数,工厂方法或setter上指定injecting
注释。文档建议您将所需的依赖项注入构造函数,而将非必需的依赖项注入setter。
另请注意,如果您正在注入构造函数并且参数是干净的,那么您可以省略@Autowired
注释,Spring会想出来。
@Autowired
。因此,您可以执行以下操作之一:
findOne
注入userRepository
构造函数(如上所示)。我会这样做。@RestController
注入userRepository
(内部@Service
)类中,为您执行此类操作。也许你可以用它来创建一个注释。 P.S。使用@Component
代替@PostMapping
p.p.s。如果有任何疑问,请转到官方文档页面,然后按@RequestMapping(method = RequestMethod.POST)
:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/注意CTRL-F
字样,它会始终显示最新版本。
p.p.p.s每个Spring项目都有自己的current
网页以及快速.io
,您可以在其中快速查看示例项目,并附上解释,希望您什么都不知道。
希望有所帮助! :)
如果您愿意,请不要忘记将答案标记为已接受
答案 2 :(得分:0)
使用Jose的输入,我采取了一些不同的路线。
这是我做的:
我创建了一个ValidatedUser
类:
@RequestScope
@Component
public class ValidatedUser {
private UserEntity user;
public UserEntity getUser() {
return user;
}
public void setUser(UserEntity user) {
this.user = user;
}
}
我还创建了一个包装类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中设置了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;
}
}
现在,我可以通过在必要时自动装配HttpRequestScopeConfig
来访问其余服务层中的这些变量。