此类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`来解决问题。
答案 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());
}
}