何时以及如何在我的Rest Api中实例化Spring Bean

时间:2017-08-26 03:24:42

标签: java spring rest spring-boot spring-bean

首先,我是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,但我仍然迷失在如何在我的代码中实现它。

非常感谢任何帮助/示例。

3 个答案:

答案 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项目完成的:

  1. 创建JPA实体User

  2. 在中设置spring.datasource.url和登录名/密码 resources/application.properties

  3. 创建此界面:

    import org.springframework.data.repository.CrudRepository;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface UserRepository extends CrudRepository<User, Long> {
    }
    

    注意,Spring在幕后实现它。

  4. 将此接口注入RestController(或任何其他Spring bean):

        private UserRepository userRepository ;
    
    **constructor**(UserRepository ur){
        userRepository = ur;
    }
    

    注意,Spring Bean是任何带注释的类@Component(这包括像ControllerRepository这样的构造型注释 - 只需查看注释的内容,它可以使用{{1在内部)或从注释为@Component的方法返回(只能在@BeanComponent类上)。通过搜索类路径注入ConfigurationComponent更自然地注入。

  5. 另请注意,Bean在字段或构造函数,工厂方法或setter上指定injecting注释。文档建议您将所需的依赖项注入构造函数,而将非必需的依赖项注入setter。

    另请注意,如果您正在注入构造函数并且参数是干净的,那么您可以省略@Autowired注释,Spring会想出来。

    1. 调用其方法@Autowired
    2. 因此,您可以执行以下操作之一:

      • 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来访问其余服务层中的这些变量。