gpt4 book ai didi

java - 将对象的新实例注入(inject)每个请求处理程序

转载 作者:行者123 更新时间:2023-11-30 06:15:08 25 4
gpt4 key购买 nike

我有很多 Spring RestControllers,它们的方法用 RequestMapping 注释。我现在想将一个自定义对象注入(inject)到这些 RequestMapping 方法中,并为每个请求创建一个自定义实例。

我想写如下内容:

@RequestMapping("/search")
public SomeReturnObject foobar(@RequestParam("query") String query, MyRequestFoo foo) {
// ...
}

现在我想创建一种机制,每次调用该方法(即每个请求)都会创建一个新的 MyRequestFoo 实例并将其注入(inject)到该方法中。如果使用参数注释而不是按类型注入(inject)会更好,那也可以(例如 @MyRequestInject MyRequestFoo foo)。

我需要知道我现在是否可以创建一个方法来创建 MyRequestFoo 的新实例,尤其是针对该请求,如下所示:

public MyRequestFoo createRequestInstanceSomehow(HttpServletRequest request) {
// extract some values from the HttpServletRequest and create a
// new MyRequestFoo instance from that and return it
}

是否可以通过任何方式创建这样一种机制,以便我可以将自定义的每个请求对象注入(inject)到我的请求处理方法中?

最佳答案

Spring MVC 有一个直接支持您的请求的参数解析器结构。每个用 @RequestMapping 注释的处理程序方法都将进行参数解析,其中框架扫描处理程序参数,检查类型并实例化适当的对象。这就是注入(inject)请求、模型和许多其他类型背后的机制,只需在处理程序的方法签名中声明对象即可。

您可以编写自定义参数解析器来解析自定义类型并在方法中使用。程序简单三步流程

  1. 制作一个 POJO 类,在您的情况下为 MyRequestFoo

  2. 做一个解析器,例如

      public class MyRequestFooResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {

    return parameter.getParameterType().equals(MyRequestFoo.class);
    }

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

    return new MyRequestFoo();
    }
    }

3.注册解析器

 <mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="your.package.MyRequestFooResolver "></bean>
</mvc:argument-resolvers>
</mvc:annotation-driven>

或者在java配置中

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void addArgumentResolvers(List< Handlermethodargumentresolver > argumentResolvers) {
MyRequestFooResolver myRequestFooResolver = new MyRequestFooResolver ();
argumentResolvers.add(myRequestFooResolver );
}
}

只需将类型添加为处理程序方法参数即可使用它

@RequestMapping("/search")
public SomeReturnObject search(MyRequestFoo foo) {
// ...
}

关于java - 将对象的新实例注入(inject)每个请求处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29250080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com