当字段和值具有不同的字段名称时,将HTTP请求值映射到Sprint Boot应用程序中的对象?

时间:2015-10-01 22:50:09

标签: spring-boot

此类AuthorizationRequest实例是在HTTP请求期间创建的,params是在查询字符串中发送的。

@RequestMapping(value = "/authorize", method = {RequestMethod.GET, RequestMethod.POST})
    public String authorize(
            @Valid AuthorizationRequest authorizationRequest,
            BindingResult result
    ) {

我想使用此代码,这是来自AuthorizationRequest class:

的示例参数
@NotEmpty
@JsonProperty("client_id")
private String clientId;

但新实例的归档clientId为空,因为在查询字符串中,此参数的值在client_id参数下。

有没有办法告诉Spring哪个参数来自HTTP请求应该用于创建实例的一个特定字段?我需要用不同的命名clientId and client_id`来解决问题。

2 个答案:

答案 0 :(得分:0)

您需要的是一个处理每种clientId的setter。请记住,如果同时指定了clientId和client_id,那么它将是未知的,哪个优先。

//These methods will allow clientId or client_id 
to be used as arguments setting the same field this.clientId
public void setClient_id(String client_id) {
    this.clientId = client_id;
}

public void setClientId(String client_id) {
    this.clientId = client_id;
}

我用帖子和get

测试了这个
get - http://localhost:8080/authorize?clientId=2&username=someusername
get - http://localhost:8080/authorize?client_id=2&username=someusername

post - http://localhost:8080/authorize 
Content-Type: application/x-www-form-urlencoded 
Body: clientId=2&username=someusername

or Body: client_id=2&username=someusername

当我使用@RequestBody注释AuthorizationRequest然后使用application / json而不是application / x-www-form-urlencoded

时,我才能识别@JsonProperty(“client_id”)

答案 1 :(得分:0)

我找到了自己实现org.springframework.web.method.supportHandlerMethodArgumentResolver的解决方案。

解析器实施:

public class AuthorizationRequestResolver implements HandlerMethodArgumentResolver {

    private static Logger LOG = Logger.getLogger(AuthorizationRequestResolver.class);

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(AuthorizationRequest.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter,
                                  ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest,
                                  WebDataBinderFactory binderFactory) throws Exception {

        HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();

        AuthorizationRequest authRequest = mapFromServletRequest(request);
        return authRequest;

    }

    private AuthorizationRequest mapFromServletRequest(HttpServletRequest request) {
        AuthorizationRequest authorizationRequest = new AuthorizationRequest();
        authorizationRequest.setClientId(request.getParameter("client_id"));
        authorizationRequest.setRedirectUri(request.getParameter("request_uri"));
        authorizationRequest.setResponseType(request.getParameter("response_type"));
        authorizationRequest.setScope(request.getParameter("scope"));
        authorizationRequest.setState(request.getParameter("state"));
        return authorizationRequest;
    }

}

cofiguration 类:

@Configuration
public class WebappConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new AuthorizationRequestResolver());
    }

}