当前位置: 首页 > 知识库问答 >
问题:

Spring MVC控制器前处理请求体

焦信鸥
2023-03-14

根据请求主体中的session_type,我必须将请求映射到特定的POJO(JSON->JAVA POJO)。

例如,如果请求正文中的'session_type'是'typeX',那么请求应该映射到ClassX POJO。如果请求正文中的“session_type”是“type y”,那么请求应该映射到ClassY POJO。

如果有一种方法可以使用某种requestbody注释来完成它呢?

共有1个答案

公冶鸣
2023-03-14

如果要绑定typextypey,那么肯定需要两个处理程序。但是,为什么我们不使用@requestmappingparam选项:

@RequestMapping(method = RequestMethod.POST, 
        value = "/url", params = "session_type=typeX")
public String handleTypeX(@RequestBody @ModelAttribute TypeX typeX){
    //TODO implement
}

@RequestMapping(method = RequestMethod.POST,
        value = "/url", params = "session_type=typeY")
public String handleTypeY(@RequestBody @ModelAttribute TypeY typeY){
    //TODO implement
}

如果您需要一些准备工作(例如,规范化params或手动执行模型绑定),那么您可以将上述方法与@initbinder结合使用,但是请注意,@initbinder需要精确的ULR规则以及处理程序中的@modelattribute参数。

编辑:在Spring MVC中,不可能使用两个处理程序来处理确切的URL,即当method/URL/params/consumes类型相同时。

因此,我建议使用统一处理程序,检查必要的参数,然后手动转换为相应的类。为了找到必要的类,我认为最好使用策略模式:

//class resolver according "session_type" parameter
//note, that you can use Spring autowiring capabilities
private final Map<String, Class> TYPES_CONTEXT = new HashMap<String, Class>(){
    {
        this.put("x", TypeX.class);
        this.put("y", TypeY.class);
        //TODO probably other classes
    }
}


@RequestMapping(method = RequestMethod.POST,
        value = "/url")
public @ResponseBody String handleAnyType(@RequestBody Map<String, String> body){
    String sessionType = body.get("session_type");

    //TODO handle case if sessionType is NULL

    Class convertedClass = TYPES_CONTEXT.get(sessionType);

    //TODO handle case if class is not found

    Object actualObject = objectMapper.convertValue(body, convertedClass);

    //now we use reflection for actual handlers, but you may refactor this in the way you want, f.e. again with Strategy pattern
    //note that current approach there should be contract for methods names
    Method actualHandler = this.getClass().getMethod("handle" + actualObject.getClass().getSimpleName());

    return (String)actualHandler.invoke(this, actualObject);
}

public String handleTypeX(TypeX typeX){
    //TODO implement
}

public String handleTypeY(TypeY typeY){
    //TODO implement
}

//TODO probably other methods

这种方法不处理验证,并且省略了一些事情,但我相信这可能会有帮助。

 类似资料:
  • 我想扩展一个Spring应用程序的功能,包括一个HTTPendpoint,以接收贝宝即时支付通知。 Paypal在HTTP正文中发送这些内容,如下所示: MC_Gross=19.95&protection_eligibility=合格&address_status=确认状态s&txn_type=express_checkout&item_name=&mc_currency=usd&item_num

  • 频率控制是控制资源利用和保证服务高质量的重要机制。Go可以使用goroutine,channel和ticker来以优雅的方式支持频率控制。 package main import "time" import "fmt" func main() { // 首先我们看下基本的频率限制。假设我们得控制请求频率, // 我们使用一个通道来处理所有的这些请求,这里向requests

  • 我的Spring Boot应用程序中有一系列Rest API控制器,其请求映射与某些URL匹配。我需要更改我的实现,以始终确保为所有请求设置特定的自定义标头。如果标头不在那里,我想使请求失败。如果是这样,我想转发到适当的控制器,这将与我当前的实现相同。 有没有办法在Spring Boot做到这一点,而无需修改我现有的控制器呢?我可以尝试使用类似Spring Security的东西吗,即使我的头与安

  • 本文向大家介绍springmvc处理异步请求的示例,包括了springmvc处理异步请求的示例的使用技巧和注意事项,需要的朋友参考一下 springmvc 3.2开始就支持servlet3.0的异步请求。平常我们请求一个controller一般都是同步的,如果在代码执行中,遇到耗时的业务操作,那servlet容器线程就会被锁死,当有其他请求进来的时候就会受堵了。 springmvc3.2之后支持异

  • 请求处理 fpm_run()执行后将fork出worker进程,worker进程返回main()中继续向下执行,后面的流程就是worker进程不断accept请求,然后执行PHP脚本并返回。整体流程如下: (1)等待请求: worker进程阻塞在fcgi_accept_request()等待请求; (2)解析请求: fastcgi请求到达后被worker接收,然后开始接收并解析请求数据,直到req

  • 我用以下方法编写了一个spring控制器来处理回调http请求, 但是我得到错误:由处理程序执行导致的已解决异常:org.springframework.web.HttpMediatypeNotSupportedException:不支持内容类型'application/octet-stream' 我不能更改回调http请求,因为它们来自其他第三方服务,我如何更改控制器以正确获取请求参数?