Java Spring:将@RequestBody注入@Bean

Java Spring:将@RequestBody注入@Bean,java,spring,spring-mvc,dependency-injection,autowired,Java,Spring,Spring Mvc,Dependency Injection,Autowired,我想在执行控制器的更新(…)时/在执行之前填充requestScopedBean.userDetails 在我的spring web项目中,我有基于java的MyConfiguration扩展了WebMVCConfigureAdapter,其中我有: @Bean(name = "requestScopedBean") @Scope(value = "prototype") public RequestScopedBean requestScopedBean() { return new

我想在执行控制器的
更新(…)
时/在执行之前填充
requestScopedBean.userDetails

在我的spring web项目中,我有基于java的
MyConfiguration扩展了WebMVCConfigureAdapter
,其中我有:

@Bean(name = "requestScopedBean")
@Scope(value = "prototype")
public RequestScopedBean requestScopedBean() {
    return new RequestScopedBean();
}
RequestScopedBean.java
中时:

public class RequestScopedBean {

    public @Autowired UserDetails userDetails;

    public void setUserDetails(UserDetails pUserDetails){
        userDetails = pUserDetails;
    }

    @Override
    public String toString() {
        return "" + (userDetails != null) ;
    }
}
UserDetails.java

public class UserDetails {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
我有
userscoontroller.java
包含:

@RestController
@RequestMapping("/users")
@Scope("request")
public class UsersController {

    @Autowired
    private RequestScopedBean requestScopedBean;

     @RequestMapping(
         value = {"{uid}" }, 
         method = RequestMethod.PUT, 
         produces = MediaType.APPLICATION_JSON_UTF8_VALUE
    )
    public ResponseEntity<?> update(
        @PathVariable String uid,
        @RequestBody UserDetails pUserDetails
    ) throws Exception {

        // LOCATION 1

        // return ResponseEntity;
    }
}
@RestController
@请求映射(“/users”)
@范围(“请求”)
公共类用户控制器{
@自动连线
私有RequestScopedBean RequestScopedBean;
@请求映射(
值={{uid}},
方法=RequestMethod.PUT,
products=MediaType.APPLICATION\u JSON\u UTF8\u值
)
公众回应更新(
@路径变量字符串uid,
@RequestBody用户详细信息pUserDetails
)抛出异常{
//地点1
//返回响应性;
}
}
位置1
requestScopedBean.userDetails
将此函数中接收的变量
pUserDetails
作为参数保存


我正在寻找一些基于setter的依赖项注入一些基于工厂方法的注入,但请务必建议是否有其他方法更合适。谢谢

如果您只想保留来自请求的UserDetails对象,只需将该对象设置为requestScopedBean即可

@RestController
@RequestMapping("/users")
@Scope("request")
public class UsersController {

    @Autowired
    private RequestScopedBean requestScopedBean;

     @RequestMapping(
         value = {"{uid}" }, 
         method = RequestMethod.PUT, 
         produces = MediaType.APPLICATION_JSON_UTF8_VALUE
    )
    public ResponseEntity<?> update(
        @PathVariable String uid,
        @RequestBody UserDetails pUserDetails
    ) throws Exception {

        requestScopedBean.setUserDetails(pUserDetails);

        // return ResponseEntity;
    }
}

让我知道,这种方法面临的问题是什么。

在requestScopedBean中设置了更多参数的控制器中,我必须编写一长串setter指令。在一个更复杂的场景中,我需要用“uid”等填充requestScopedBean。。。因此我想改为自动连接。请求参数中的pUserDetails已经填充了值,您不需要调用pUserDetails的setter来设置值。其次,如果您正在考虑许多路径变量,比如uid,并且希望将它们保留在requestScopedBean中,那么对于更干净的方法,我建议您创建一个包含所有参数的新类,并将其用作ResponseBy。因为如果使用path变量,则必须调用setter。没有更好的方法“我想填充requestScopedBean.userDetails”,“我正在寻找一些基于setter的依赖注入”,然后调用
setUserDetails
。我没有发现问题。当前位于位置1的requestScopedBean.userDetails保持为空,因为您没有调用
setUserDetails
public class RequestScopedBean {

    public UserDetails userDetails;

    public void setUserDetails(UserDetails pUserDetails){
        userDetails = pUserDetails;
    }

    @Override
    public String toString() {
        return "" + (userDetails != null) ;
    }
}