Spring:将@RequestBody注入到@Bean中

5

当我的控制器的update(...)被执行/在执行之前,我希望填充requestScopedBean.userDetails

在我的Spring Web项目中,我有一个基于Java的MyConfiguration extends WebMvcConfigurerAdapter,其中我有:

@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) ;
    }
}

And 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;
    }
}

我有一个 UsersController.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;
    }
}

我该如何做才能让LOCATION 1处的requestScopedBean.userDetails持有这个函数作为参数接收到的pUserDetails变量。

我正在寻找一些基于setter的依赖注入或者一些基于工厂方法的注入,不过如果有其他更适合的方法,请建议。谢谢。


我想填充requestScopedBean.userDetails。我正在寻找一些基于setter的依赖注入。然后调用setUserDetails。我没有看到任何问题。 - a better oliver
目前在LOCATION 1,requestScopedBean.userDetails仍然为null。 - zur
因为您没有调用 setUserDetails - a better oliver
1个回答

1
如果您只想保留来自请求的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中自动装配UserDetails对象。
public class RequestScopedBean {

    public UserDetails userDetails;

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

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

请告诉我,您在使用这种方法时遇到了什么问题。


在一个控制器中,如果有更多的参数需要在requestScopedBean中设置,我将不得不编写一长串的setter指令。在更复杂的情况下,我需要用'uid'等来填充requestScopedBean...因此我考虑使用自动装配。 - zur
请求参数中的pUserDetails已经填充了值,您不需要调用pUserDetails的setter方法来设置值。 - Avinash
1
其次,如果您正在考虑像uid这样的许多路径变量,并且希望将它们保留在requestScopedBean中,则为了更清晰的方法,我建议您创建一个包含所有参数的新类并将其用作ResponseBody。因为如果您使用路径变量,则必须调用setter。没有更好的方法。 - Avinash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接