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

Java 如何在Spring中将RequestHeader转换为自定义对象,java,spring,spring-mvc,Java,Spring,Spring Mvc,我的控制器中有一个方法: @RequestMapping(method = RequestMethod.POST) public CustomObject createCustomObject(final @RequestHeader("userId") Long userId) { ... } 我是否可以编写一些自定义转换器或类似的东西来将此RequestHeader userId参数转换为User对象,以便我的方法是: @RequestMapping(method = Request

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

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

如果我理解您的意思,您希望接收一个参数并将其转换为复杂对象

您必须定义一个自定义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);
        }
    }
...
}
更多信息:


基本上,我是根据评论中的建议实施的。 以下是一个例子:

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;
    }
}
import org.springframework.core.convert.converter.converter;
导入org.springframework.stereotype.Component;
@组成部分
公共类UserFromHeaderConverter实现转换器{
@凌驾
公共用户转换(最终字符串用户ID){
//从数据库中获取用户等。
最终用户=新用户();
user.setId(userId);
user.setFirstName(“第一”);
user.setLastName(“Last”);
返回用户;
}
}
要测试它,请执行:
curl--header“userId:123”localhost:8080/user

结果将是:
嘿,用户{id='123',firstName='First',lastName='Last'}

版本:

  • springboot:2.0.3
  • springweb:5.0.7

您是否尝试过使用
@RequestHeader
注释后一个方法参数?然后,只需将
String
的转换器注册到
User
即可。这取决于
userId
发布到服务器的方式。如果可以将用户对象作为json/xml发布,则可以使用
@RequestBody
注释。发布的
User
对象将包含
userId
,其他所有内容都可以为空@RKodakandla它应该作为标题而不是json/xml发布。@M.Deinum不确定如何注册转换器。请提供一些教程或网址?我应该实现org.springframework.core.convert.converter.converter接口吗?请参阅和。
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;
    }
}