在Spring中创建自己的类,将HTTP请求转换为对象?
我想创建自己的类,该类将转换HTTP请求,并在我的SpringMVC应用程序中从该HTTP请求初始化对象。我可以通过在方法中定义参数来创建对象,但我需要以自己的方式进行映射并手动进行 我如何使用我自己的实现来实现它,它将传递给Spring并无缝地使用它 更新1 善意提供的解决方案在Spring中创建自己的类,将HTTP请求转换为对象?,spring,spring-mvc,httprequest,Spring,Spring Mvc,Httprequest,我想创建自己的类,该类将转换HTTP请求,并在我的SpringMVC应用程序中从该HTTP请求初始化对象。我可以通过在方法中定义参数来创建对象,但我需要以自己的方式进行映射并手动进行 我如何使用我自己的实现来实现它,它将传递给Spring并无缝地使用它 更新1 善意提供的解决方案Bohuslav Burghardt不起作用: HTTP状态500-请求处理失败;嵌套异常是 java.lang.IllegalStateException:错误/BindingResult参数为 应在模型属性之后立即声
Bohuslav Burghardt
不起作用:
HTTP状态500-请求处理失败;嵌套异常是
java.lang.IllegalStateException:错误/BindingResult参数为
应在模型属性之后立即声明
@RequestBody或应用它们的@RequestPart参数:public
java.lang.String
cz.derivis.derivis.api.oauth2.provider.controllers.OAuthController.authorize(api.oauth2.provider.domain.AuthorizationRequest,org.springframework.ui.Model,org.springframework.validation.BindingResult,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
也许我应该提到我使用自己的验证器:
public class RequestValidator {
public boolean supports(Class clazz) {
return AuthorizationRequest.class.equals(clazz);
}
public void validate(Object obj, Errors e) {
AuthorizationRequest request = (AuthorizationRequest) obj;
if ("foobar".equals(request.getClientId())) {
e.reject("clientId", "nomatch");
}
}
}
以及在控制器中声明我的方法(请不要使用验证-@Valid
):
我的应用程序中有两个配置类
@Configuration
@EnableAutoConfiguration
@EnableWebMvc
@PropertySource("classpath:/jdbc.properties")
public class ApplicationConfig {
}
及
@配置
@EnableWebMvc
公共类WebappConfig扩展了WebMVCConfigureAdapter{
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
添加(新授权请求ArgumentResolver());
}
}
怎么了?
更新2
问题在于param
BindingResult
,当我删除它时,它会工作。但当出现错误时,我需要结果来处理它 如果我正确理解您的需求,您可以为此实现定制。有关实施细节,请参见下面的示例:
模型对象
public class AuthorizationRequestHolder {
@Valid
private AuthorizationRequest authorizationRequest;
private BindingResult bindingResult;
// Constructors, accessors omitted
}
解析器
public class AuthorizationRequestMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return AuthorizationRequestHolder.class.isAssignableFrom(parameter.getParameterType());
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
// Map the authorization request
AuthorizationRequest authRequest = mapFromServletRequest(request);
AuthorizationRequestHolder authRequestHolder = new AuthorizationRequestHolder(authRequest);
// Validate the request
if (parameter.hasParameterAnnotation(Valid.class)) {
WebDataBinder binder = binderFactory.createBinder(webRequest, authRequestHolder, parameter.getParameterName());
binder.validate();
authRequestHolder.setBindingResult(binder.getBindingResult());
}
return authRequestHolder;
}
}
配置
@Configuration
@EnableWebMvc
public class WebappConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new AuthorizationRequestMethodArgumentResolver());
}
}
编辑:更新了答案,解决了使用
HandlerMethodArgumentResolver
参数时不支持使用@Valid
的问题。问题似乎是由于无法将HandlerMethodArgumentResolver
与@Valid
注释一起使用。有关更多详细信息,请参阅。不幸的是,我从未在这个场景中亲自使用过它。也许那篇文章中的一些信息会有所帮助。如果我找到了一个有效的解决方案,我会尝试研究它并更新我的答案。是的,可能我不知道为什么不能同时使用HandlerMethodArgumentResolver
和@Valid
。Diky.在你的代码中什么是authRequest
?我假设将此代码添加到我的HandlerMethodArgumentResolver
implementation?删除了前面的注释。有关解决方法,请参阅更新的答案。authRequest应该是您的授权请求(从foo更新它以反映问题中的更改)。让我知道它是否工作在解析程序类中什么是mapFromServletRequest(request)
?这听起来像是解决这个问题的关键。
public class AuthorizationRequestMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return AuthorizationRequestHolder.class.isAssignableFrom(parameter.getParameterType());
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
// Map the authorization request
AuthorizationRequest authRequest = mapFromServletRequest(request);
AuthorizationRequestHolder authRequestHolder = new AuthorizationRequestHolder(authRequest);
// Validate the request
if (parameter.hasParameterAnnotation(Valid.class)) {
WebDataBinder binder = binderFactory.createBinder(webRequest, authRequestHolder, parameter.getParameterName());
binder.validate();
authRequestHolder.setBindingResult(binder.getBindingResult());
}
return authRequestHolder;
}
}
@Configuration
@EnableWebMvc
public class WebappConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new AuthorizationRequestMethodArgumentResolver());
}
}
@RequestMapping("/auth")
public void doSomething(@Valid AuthRequestHolder authRequestHolder) {
if (authRequestHolder.getBindingResult().hasErrors()) {
// Process errors
}
AuthorizationRequest authRequest = authRequestHolder.getAuthRequest();
// Do something with the authorization request
}