gpt4 book ai didi

java - RESTEasy 不会将我的 Spring bean 映射到自定义 Spring ContextLoader

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:07:30 28 4
gpt4 key购买 nike

  • RESTEasy 2.0.1GA
  • Java 1.6
  • Spring 3.0.3

我已尽我所能,但无法弄清正在发生的事情。我有一个 Spring MVC 应用程序,但是我希望在 Spring MVC 应用程序外部有一些可用的 RESTEasy 端点,但在同一个容器中,最终能够连接相同的 bean。

作为第一步,我只是尝试在容器内建立 RESTEasy,为来自 Spring 配置的 bean 的请求提供服务。我已经尝试了说明中的样板,也尝试了手动设置,但无济于事。

bean

@Resource
@Path("/")
public class NeighborComparison {

private String foo;

@GET @Path(value="customer") @Produces("text/plain")
public String getNeighborComparison() {
return "foo";
}
}

web.xml

<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/api</param-value>
</context-param>

<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>

<!-- NOT configuring SpringContextLoaderListener because I declare my own, so if I do, everything
blows up, plus all it actually does is sanity check configuration -->
<listener>
<listener-class>com.example.MyCustomContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>

applicationContext.xml

<bean id="resteasy.providerFactory" class="org.jboss.resteasy.spi.ResteasyProviderFactory"
factory-method="getInstance">
</bean>

<bean id="resteasy.dispatcher" class="org.jboss.resteasy.core.SynchronousDispatcher">
<constructor-arg ref="resteasy.providerFactory"/>
</bean>

<bean id="resteasy.spring.bean.processor" class="org.jboss.resteasy.plugins.spring.SpringBeanProcessor">
<description>
Add Resources and @Providers to the appropriate places
in Resteasy's infrastructure
</description>
<constructor-arg ref="resteasy.dispatcher"/>
</bean>

<bean id="neighborComparison" class="opower.api.customer.neighbor_comparison.NeighborComparison">
</bean>

根据文档,我所要做的就是“通过分配 org.jboss.resteasy.plugins.spring.SpringBeanProcessor 的实例手动注册 RESTeasy BeanFactoryPostProcessor”。我相信这个 Spring 配置可以做到这一点。

Jetty 启动,应用上下文启动,没有任何问题。应用程序正常工作,但是当我

> curl -H"Accept: text/plain" localhost:8080/ei/api/customer

(“ei”是应用程序上下文)。日志显示(只有这个):

2011-03-29 16:44:24,153 DEBUG [qtp-575315405-0] [EI] [] [asy.core.SynchronousDispatcher] PathInfo: /customer
2011-03-29 16:44:24,156 DEBUG [qtp-575315405-0] [EI] [] [asy.core.SynchronousDispatcher] Failed executing GET /customer
org.jboss.resteasy.spi.NotFoundException: Could not find resource for relative : /customer of full path: http://localhost:8080/ei/api/customer

即使我可以说服 RESTEasy 向我展示映射,它似乎也没有发现我的 bean。

如果我通过 resteasy.resources 上下文参数显式映射它,它就可以工作,尽管显然无法访问自动连接的 Spring bean。

还有什么我可以尝试的吗?我有整个 RESTEasy 代码库的调试日志,但我没有收到任何消息。我还确认 Spring 实际上正在创建我的 bean,所以只是 RESTEasy 没有找到它。

最佳答案

您的资源类需要使用 @Path 注释进行注释,以便 RESTeasy 在引导过程中获取它:

@Path("/customer")
@Resource
public class NeighborComparison {

@GET @Path("/{customerId}") @Produces("text/plain")
public String getNeighborComparison(@PathParam("customerId") long customerId) {
return "foo";
}
}

请注意 @Path("/{customerId}} 注释,否则您的 @PathParam 参数将无法正确映射,从而导致非常详细的异常(和客户端随附的 500 响应)。当然假设该服务由 RESTeasy 获取。

此外,如果您不使用 RESTeasy 的 SpringContextLoader,则必须确保您的 SpringBeanProcessor 实例已在 ApplicationContext 中注册。 RESTeasy 通过在 SpringContextLoader 中注册一个 ApplicationListener 来委托(delegate)给它:

  ApplicationListener listener = new ApplicationListener() {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
ContextRefreshedEvent cre = (ContextRefreshedEvent) event;
ConfigurableListableBeanFactory autowireCapableBeanFactory = (ConfigurableListableBeanFactory) cre
.getApplicationContext().getAutowireCapableBeanFactory();
new SpringBeanProcessor(dispatcher, registry, providerFactory)
.postProcessBeanFactory(autowireCapableBeanFactory);
}
}
};
configurableWebApplicationContext.addApplicationListener(listener);

如果使用自定义上下文加载器而不是 RESTEasy 提供的上下文加载器,则此代码必须出现在上下文加载器中的某个位置,以便一切都连接起来。有点绕,是的。 SpringBeanProcessor 遍历所有 Spring bean,并向 RESTeasy 注册那些在其层次结构(类型及其相应接口(interface))中某处具有 @Path 注释的 bean。

关于java - RESTEasy 不会将我的 Spring bean 映射到自定义 Spring ContextLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5478935/

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