在Spring中创建自己的类,将HTTP请求转换为对象?

在Spring中创建自己的类,将HTTP请求转换为对象?,spring,spring-mvc,httprequest,Spring,Spring Mvc,Httprequest,我想创建自己的类,该类将转换HTTP请求,并在我的SpringMVC应用程序中从该HTTP请求初始化对象。我可以通过在方法中定义参数来创建对象,但我需要以自己的方式进行映射并手动进行 我如何使用我自己的实现来实现它,它将传递给Spring并无缝地使用它 更新1 善意提供的解决方案Bohuslav Burghardt不起作用: HTTP状态500-请求处理失败;嵌套异常是 java.lang.IllegalStateException:错误/BindingResult参数为 应在模型属性之后立即声

我想创建自己的类,该类将转换HTTP请求,并在我的SpringMVC应用程序中从该HTTP请求初始化对象。我可以通过在方法中定义参数来创建对象,但我需要以自己的方式进行映射并手动进行

我如何使用我自己的实现来实现它,它将传递给Spring并无缝地使用它

更新1

善意提供的解决方案
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
}