RESTEasy nicht anzeigen meine Spring-bean mit benutzerdefinierten Frühjahr ContextLoader
- RESTEasy 2.0.1 GA
- Java 1.6
- Spring 3.0.3
Ich habe alles versucht, ich kann nicht Kopf oder Schwanz, was Los ist. Ich habe eine Spring-MVC-Anwendung, jedoch würde ich gerne einige RESTEasy Endpunkte verfügbar außerhalb das Spring MVC-app, sondern in den gleichen container, die letztendlich zu können, Draht in die gleichen Bohnen.
Als ersten Schritt, ich bin einfach versuchen, stand-up-RESTEasy im inneren des Containers Anfragen bedienen, welche aus einer Spring-bean konfiguriert. Ich habe versucht, den vorformulierten, von den Anweisungen und haben auch versucht, die manuelle Installation, ohne Erfolg.
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>
Gemäß der Dokumentation, alles, was ich zu tun ist “registrieren Sie manuell die RESTeasy BeanFactoryPostProcessor durch die Zuweisung einer Instanz von org.jboss.resteasy.plugins.Frühling.SpringBeanProcessor". Ich glaube, in diesem Frühjahr Konfiguration funktioniert.
Jetty gestartet und die app-Kontext hoch dreht ohne Probleme. Die Anwendung funktioniert normal, aber wenn ich
> curl -H"Accept: text/plain" localhost:8080/ei/api/customer
("ei" ist der Anwendungskontext). Das log zeigt (diese und nur diese):
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
Selbst wenn ich Sie davon überzeugen konnte RESTEasy, der mir den Zuordnungen, es scheint, dass es nur nicht entdecken, meine Bohne.
Wenn ich eine Karte, die explizit über die resteasy.resources
context-param, es funktioniert, aber offenbar keinen Zugang zu auto-WLAN-Spring-Bean.
Alles, was ich versuchen kann? Ich habe debug-log auf die gesamte RESTEasy codebase und ich bekomme keine Nachrichten. Ich habe auch bestätigt, dass der Frühling ist in der Tat schafft mein bean, so ist es nur, dass RESTEasy ist nicht zu finden.
- Spring MVC hat seine eigene REST-Stil-Rahmen. Warum nicht einfach verwenden, und vermeiden Sie das ganze problem?
- Spring MVC "rest" - Rahmen ist unglaublich schwach und feature-verhungert im Vergleich zu JAX-RS
- Wenn dein Codebeispiel ist ein Beispiel dafür, dann ist es leicht in der Lage.
- Dave, können Sie bitte teilen Sie die richtige Lösung? Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Ressource-Klasse benötigt werden, versehen mit
@Path
Anmerkung für RESTeasy zu Holen, während bootstrap:Hinweis: die
@Path("/{customerId}}
annotation ohne die Ihre@PathParam
- parameter wurden nicht richtig zugeordnet, was eine ziemlich detaillierte Ausnahme (und ein begleitendes 500 Antwort auf die client-Seite). Vorausgesetzt, der service wird abgeholt von RESTeasy natürlich.Zusätzlich, wenn Sie nicht RESTeasy ist
SpringContextLoader
Sie müssen sicherstellen, dass IhrSpringBeanProcessor
Instanz registriert mit derApplicationContext
. RESTeasy Delegierten, um es durch die Registrierung einApplicationListener
imSpringContextLoader
:Wenn Sie einen benutzerdefinierten context-loader und nicht das RESTEasy-sofern man diesen code hat, zu erscheinen, die irgendwo in Ihrem Kontext loader, damit wird alles verdrahtet. Ein wenig unübersichtlich, ja. Es ist
SpringBeanProcessor
geht durch alle Spring-beans und registriert mit RESTeasy diejenigen, die einen@Path
Anmerkung irgendwo in Ihrer Hierarchie (Typ und Ihre entsprechenden Schnittstellen).