如何在春季将请求标头转换为自定义对象

2022-09-03 06:58:44

我的控制器中有方法:

@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一起做?


答案 1

基本上,我根据评论中的建议实现了它。下面是一个示例:

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;

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

然后,我们将创建一个转换器:

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@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
  • spring-web:5.0.7

答案 2

如果我理解你,你想接收一个参数并将其转换为一个复杂的对象。

您必须定义一个实现 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));
    }
....

更多信息:


推荐