Статьи

Интеграция JAX-RS и Spring MVC

Spring MVC и JAX-RS имеют много общего. Я работал над интеграцией этих двух технологий в рамках проекта JBoss RESTEasy , и был довольно успешен в этом. Все мои изменения в репозитории RESTEasy subversion в пакете resteasy-spring . Вот некоторые из улучшений, которые я сделал:

1.
RESTEasy теперь можно использовать с Spring MVC DispatcherServlet . Все, что вам нужно сделать, это <import resource: » springmvc-resteasy.xml » />. Это имеет немало преимуществ:

o
Вы можете управлять Ресурсами JAX-RS вместе с контроллерами SprngMVC, объектами Wicket, Tapestry или Struts2 Actions. JAX-RS можно настроить для обработки взаимодействий XML и JSON, а ваша любимая инфраструктура MVC может обрабатывать создание HTML.

o
Ваши ресурсы JAX-RS могут быть полноценными контроллерами MVC, возвращая Spring ModelAndView . Это может быть представление JSP, шаблон Freemarker, XSLT или Velocity или представление RSS.

Взгляните на мой тестовый пример JUnit4 , в частности метод getCustomRepresentation ():

			/** WOOHOO!  SpringMVC ModelAndView in action */
@GET
@Produces("application/custom")
@Path("/custom-rep")
public ModelAndView getCustomRepresentation() {
return new ModelAndView("customView");
}

2. Spring управляемые встроенные серверы.

o
Существует JettyLifeCycleManager, который запускает Jetty после загрузки контекста приложения Spring и останавливает Jetty во время закрытия контекста приложения. Вы можете настроить Jetty так, чтобы он указывал на разнесенный каталог .war или файл .war и запускал ваши движки. Вот пример конфигурации Spring и Spring TestCase, который использует ее

o
There’s also a TJWS (Tiny Java Web Server) TJWSEmbeddedSpringMVCServerBean that likewise manages the web server’s life-cycle in accordance with the Spring application context. All you need to do is point to a Spring xml configuration file and a port number, and it starts up a server with a SpringMVC DispatcherServlet pointing to your configuration. It’s also managed by the Spring Application Context factory. Here’s an example spring configuration and a test case that goes with it.

3. Springier Integration

o
Resteasy supports Spring life-cycle management. You can create request or prototype beans and register them in Spring. James Strachan describes how he got Guice to inject custom annotations; I did the same thing for Spring to inject @Context member variables such as HttpHeaders (which creates a Proxy to an object that is aware of the HttpServletRequest).

o
Various minor fixes in the resteasy code base that make common resteasy components friendly to a Spring environment. One such change was to implement equals and hashCode on the proxies produced by the RESTEasy Client Framework; for some reason, the Spring PersistenceAnnotationBeanPostProcessor needed it.

4.
Easy testing. Take a look at the JUnit tests I described in the Embedded server notes. The tests don’t know anything about how Services are implemented. They don’t need know anything about which servers they hit.

I used RESTEasy because I was able to grok the code-base quicker than the other JAX-RS implementations. I’ll be glad to discuss this integration with either end users or developers of other frameworks.

This integration will be put into an official release in about a week. Please feel free to email me about it.

From New York Java Consultant