我的控制器中有方法:
@RequestMapping(method = RequestMethod.POST)
public CustomObject createCustomObject(final @RequestHeader("userId") Long userId) {
...
}
我可以编写一些自定义转换器或类似的东西来将此RequestHeader userId参数转换为User对象,因此我的方法将是:
@RequestMapping(method = RequestMethod.POST)
public CustomObject createCustomObject(final User user) {
...
}
是否可以使用spring-mvc?
答案 0 :(得分:3)
基本上,我已经完成了评论中的建议。 我将仅提供简短示例。假设我们有下一个控制器和用户POJO:
@RestController
public class SimpleController {
@GetMapping("/user")
public String greeting(@RequestHeader(name = "userId") User user) {
return "Hey, " + user.toString();
}
}
public class User {
private String id;
private String firstName;
private String lastName;
...
}
然后我们将创建转换器:
@Component
public class UserFromHeaderConverter implements Converter<String, User> {
@Override
public User convert(final String userId) {
// fetch user from the database etc.
final User user = new User();
user.setId(userId);
user.setFirstName("First");
user.setLastName("Last");
return user;
}
}
测试示例:curl --header "userId: 123" localhost:8080/user
结果将是:Hey, User{id='123', firstName='First', lastName='Last'}
按照我使用下一个版本的方式:spring-boot:2.0.3 and spring-web:5.0.7
答案 1 :(得分:-1)
如果我理解你,你想要接收一个参数并将其转换为一个复杂的对象。
您必须定义一个实现PropertyEditorSupport的自定义DataBinder流程,并为此类型注册。
例如,如果要获取bd用户表单id,请创建类:
public class UserEditor extends PropertyEditorSupport {
private final UserDAO userDao;
public <T> CacheEditor(UserDAO userDao) {
this.userDao = userDao;
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (text != null && !text.isEmpty()) {
Long code = Long.parseLong(text);
setValue(userDao.getById( code));
} else {
setValue(null);
}
}
...
}
和注册编辑:
@Controller
public class MyFormController {
@Autowire
private UserDAO userDao;
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(User.class, new UserEditor(userDao));
}
....
更多信息: