【问题标题】:How can I inject @RequestBody object(value object) to Spring Service layer?如何将@RequestBody 对象(值对象)注入 Spring Service 层?
【发布时间】:2019-05-28 11:04:03
【问题描述】:

如何将@RequestBody 对象(值对象)注入 Spring Service 层?

我想注入(Autowired)来自请求正文值的对象。

HelloController

@Autowired
UserService userService;

(….)

@GetMapping("/hello")
public String hello(
        @RequestBody UserRequestBodyDto userDto,
        HttpServletResponse response){

    return null;
}

UserRequestBodyDto

@Data
public class UserRequestBodyDto{
    private String name;
    private String address;
}

UserServiceImpl

@Service
public class UserServiceImpl implements UserService{

    @AutoWired
    public UserServiceImpl(UserRequestBodyDto userDto){
      (….)
    }

}

在这种情况下,如何将 UserRequestBodyDto 对象注入服务层?

向 UserService 添加 'setUserDto' 方法是最好的方法吗? 或者如果 将 dto 转换为实体是注入对象的最佳方式, 如何在 dto 类和实体类之间管理许多相同的类?

+a) 在我看来,RequestScopedBean 是不好的方式。

参考:Spring: injecting @RequestBody into @Bean

【问题讨论】:

    标签: java spring spring-boot dependency-injection


    【解决方案1】:

    为什么需要@AutoWired 一个请求对象?在对请求对象进行操作时,我似乎完全没有必要,因为每次新请求都会改变。

    所以你可以在服务层方法中对请求对象进行操作。

     public UserServiceImpl(UserRequestBodyDto userDto){
          (….)//do operation with userDto here.
     }
    

    或者,我真的需要 @AutoWire 请求对象,然后在服务层中声明 UserRequestBodyDto userDto 并使用 @AutoWired 注释。当服务层方法执行时,只需将值设置为this.userDto

    @Service
    public class UserServiceImpl implements UserService{
        @AutoWired
        private UserRequestBodyDto userDto;
    
        @AutoWired
        public UserServiceImpl(UserRequestBodyDto userDto){
          this.userDto = userDto;//Here, setting value of userDto to this.userDto
        }
    
    }
    

    【讨论】:

    • 抱歉我的错误,我不知道 Beans 总是由单例管理的。
    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多