如何在Spring中将RequestHeader转换为自定义对象

时间:2015-08-28 12:24:48

标签: java spring spring-mvc

我的控制器中有方法:

@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?

2 个答案:

答案 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));
    }
....

更多信息: