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

20

我在我的控制器中有一个方法:

@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可以实现吗?


4
你尝试过在后续方法参数上使用@RequestHeader进行注释吗?然后只需注册StringUser的转换器即可完成。 - M. Deinum
这取决于如何将 userId 发送到服务器。如果您可以将用户对象作为 json/xml 发布,那么您可以使用 @RequestBody 注释。发布的 User 对象将包含 userId,其他所有内容都可以为空。http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestbody - RKodakandla
@RKodakandla 应该作为标题发布,而不是作为 JSON/XML。 - Orest
@M. Deinum不确定如何注册转换器。能否提供一些教程或网址?我应该实现org.springframework.core.convert.converter.Converter接口吗? - Orest
1
请参阅 http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert 和 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config-conversion。 - M. Deinum
显示剩余2条评论
2个回答

19

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

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

0

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

您必须定义一个自定义的DataBinder-process,实现PropertyEditorSupport并为类型注册它。

例如,如果您想要从id创建bd用户表单,则创建以下类:

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

更多信息:


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