2010-04-09 13 views

Respuesta

3

Mire Apache CXF. Utiliza Spring.

+1

Gracias por la pronta respuesta. Lo echaré un vistazo. Pero, creo que es más como un marco construido sobre la primavera, lo que realmente me gusta es ver una aplicación web de varios niveles construida en Spring. –

+0

No puedo ayudarte con webapps. CXF tiene muchos ejemplos de configuración de contexto de la aplicación Spring. – bmargulies

7

Algunos candidatos:

  • Spring's PetStore

  • AppFuse - En AppFuse, el Marco del resorte se utiliza a través de su apoyo Hibernate/iBATIS, las transacciones declarativas, la unión de dependencia y la capa de desacoplamiento.

  • Equinox (a.k. a AppFuse Light): una aplicación CRUD simple creada como parte de Spring Live.

  • Spring by Example - Varios ejemplos de Spring más algunas bibliotecas descargables.

  • Tudu Lists - Tudu Lists es una aplicación J2EE para administrar listas de tareas pendientes. Se basa en JDK 5.0, Spring, Hibernate y una interfaz AJAX (utilizando el marco DWR).

  • spring-petstore

17

trabajo para una compañía de seguros de salud grande en el que utilizamos en gran medida en la primavera de back-end. Le mostraré cómo se construye una aplicación modularizada.

EsqueletoWEB-INF sin directorio de clases

ar 
    WEB-INF 
     web.xml 
     /** 
      * Spring related settings file 
      */ 
     ar-servlet.xml 
     web 
      moduleA 
       account 
        form.jsp 
      moduleB 
       order 
        form.jsp 

Esqueletoclases directorio

 classes 
      /** 
       * Spring related settings file 
       */ 
      ar-persistence.xml 
      ar-security.xml 
      ar-service.xml 
      messages.properties 
      br 
       com 
        ar 
         web 
          moduleA 
           AccountController.class   
          moduleB 
           OrderController.class 
      br 
       com 
        ar 
         moduleA 
          model 
           domain 
            Account.class 
           repository 
            moduleA.hbm.xml 
           service 
      br 
       com 
        ar 
         moduleB 
          model 
           domain 
            Order.class 
           repository 
            moduleB.hbm.xml 
           service 
      ... 

Aviso cómo cada paquete bajo br.com.ar.webma tchsWEB-INF/view directorio. Es la clave necesaria para ejecutar convención sobre configuración en Spring MVC. Cómo ??? depender de ControllerClassNameHandlerMapping

WEB-INF/ar-servlet.xml propiedad basePackage Aviso lo que significa buscar cualquier clase @Controller bajo br.com.ar.view paquete. Esta propiedad permite construir modular @ Controlador de

<!--Scans the classpath for annotated components at br.com.ar.web package--> 
<context:component-scan base-package="br.com.ar.web"/> 
<!--registers the HandlerMapping and HandlerAdapter required to dispatch requests to your @Controllers--> 
<mvc:annotation-driven/> 
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> 
    <property name="basePackage" value="br.com.ar.web"/> 
    <property name="caseSensitive" value="true"/> 
    <property name="defaultHandler"> 
     <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/> 
    </property> 
</bean> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/view/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

Ahora vamos a ver, por ejemplo, AccountController

package br.com.ar.web; 

@Controller 
public class AccountController { 

    @Qualifier("categoryRepository") 
    private @Autowired Repository<Category, Category, Integer> categoryRepository; 

    @Qualifier("accountRepository") 
    private @Autowired Repository<Account, Accout, Integer> accountRepository; 

    /** 
    * mapped To /account/form 
    */ 
    @RequestMapping(method=RequesMethod.GET) 
    public void form(Model model) { 
     model.add(categoryRepository().getCategoryList()); 
    } 

    /** 
    * mapped To account/form 
    */ 
    @RequestMapping(method=RequesMethod.POST) 
    public void form(Account account, Errors errors) { 
     accountRepository.add(account); 
    } 

} 

¿Cómo funciona ???

Suponga que ha hecho una petición de http://127.0.0.1:8080/ar/moduleA/account/forma .html

primavera eliminará el camino entre ruta de contexto y extensión de archivo - destacó anteriormente. Vamos a leer el camino extraída desde la derecha a la izquierda

  • forma de nombre método
  • cuenta nombre de clase no calificado sin controlador sufijo
  • moduleA paquete que se sumarán a basePackage propiedad

que se traduce a

br.com.ar.web.moduleA.AccountController.form 

Ok. ¿Pero cómo sabe Spring qué vista mostrar? Ver here

Y sobre persistencia problemas relacionados ???

En primer lugar, vea here cómo implementamos el repositorio. Observe que cada consulta de módulo relacionado se almacena en su paquete de repositorio relacionado. Ver esqueleto arriba. Aquí se muestra Aviso ar-persistence.xml mappingLocations y packagesToScan propiedad

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
         http://www.springframework.org/schema/util 
         http://www.springframework.org/schema/util/spring-util-2.5.xsd 
         http://www.springframework.org/schema/jee 
         http://www.springframework.org/schema/jee/spring-jee-2.5.xsd"> 
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/dataSource" resource-ref="true"> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="mappingLocations"> 
      <util:list> 
       <value>classpath:br/com/ar/model/repository/hql.moduleA.hbm.xml</value> 
       <value>classpath:br/com/ar/model/repository/hql.moduleB.hbm.xml</value> 
      </util:list> 
     </property> 
     <property name="packagesToScan"> 
      <util:list> 
       <value>br.com.ar.moduleA.model.domain</value> 
       <value>br.com.ar.moduleB.model.domain</value> 
      </util:list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop> 
       <prop key="hibernate.connection.charSet">UTF-8</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.validator.autoregister_listeners">false</prop> 
      </props> 
     </property> 
    </bean> 
</beans> 

Aviso estoy usando Hibernate. JPA debe estar configurado correctamente.

Transacción de exploración componente de gestión y ar-service.xml Aviso Dos puntos después debr.com.ar en AOP: atributo de expresión del punto de corte que significa

Cualquier paquete y sub-package en paquete br.com.ar

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
         http://www.springframework.org/schema/tx  
         http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 
    <context:component-scan base-package="br.com.ar.model"> 
    <!--Transaction manager - It takes care of calling begin and commit in the underlying resource - here a Hibernate Transaction --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 
    <tx:advice id="repositoryTransactionManagementAdvice" transaction-manager="transactionManager"> 
     <tx:attributes> 
      <tx:method name="add" propagation="REQUIRED"/> 
      <tx:method name="remove" propagation="REQUIRED"/> 
      <tx:method name="update" propagation="REQUIRED"/> 
      <tx:method name="find*" propagation="SUPPORTS"/> 
     </tx:attributes> 
    </tx:advice> 
    <tx:advice id="serviceTransactionManagementAdvice" transaction-manager="transactionManager"> 
     <!--Any method - * - in service layer should have an active Transaction - REQUIRED - --> 
     <tx:attributes> 
      <tx:method name="*" propagation="REQUIRED"/> 
     </tx:attributes> 
    </tx:advice> 
    <aop:config> 
     <aop:pointcut id="servicePointcut" expression="execution(* br.com.ar..service.*Service.*(..))"/> 
     <aop:pointcut id="repositoryPointcut" expression="execution(* br.com.ar..repository.*Repository.*(..))"/> 
     <aop:advisor advice-ref="serviceTransactionManagementAdvice" pointcut-ref="servicePointcut"/> 
     <aop:advisor advice-ref="repositoryTransactionManagementAdvice" pointcut-ref="repositoryPointcut"/> 
    </aop:config> 
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 
</beans> 

Prueba

el método de ensayo @Controller anotada, ver cómo here

Aparte de capa web. Observe cómo configuro una fuente de datos JNDI en el método @Before

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:ar-service.xml", "classpath:ar-persistence.xml"}) 
public class AccountRepositoryIntegrationTest { 

    @Autowired 
    @Qualifier("accountRepository") 
    private Repository<Account, Account, Integer> repository; 

    private Integer id; 

    @Before 
    public void setUp() { 
     SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder(); 
     DataSource ds = new SimpleDriverDataSource(new oracle.jdbc.driver.OracleDriver(), "jdbc:oracle:thin:@127.0.0.1:1521:ar", "#$%#", "#$%#"); 

     builder.bind("/jdbc/dataSource", ds); 
     builder.activate(); 

     /** 
      * Save an Account and set up id field 
      */ 
    } 

    @Test 
    public void assertSavedAccount() { 
     Account account = repository.findById(id); 

     assertNotNull(account); 
    } 

} 

Si necesita una serie de pruebas, haga lo siguiente

@RunWith(Suite.class) 
@Suite.SuiteClasses(value={AccountRepositoryIntegrationTest.class}) 
public void ModuleASuiteTest {} 

web.xml se muestra de la siguiente manera

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      classpath:ar-persistence.xml 
      classpath:ar-service.xml 
     </param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>ar</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>ar</servlet-name> 
     <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout>30</session-timeout> 
    </session-config> 
    <resource-ref> 
     <description>datasource</description> 
     <res-ref-name>jdbc/dataSource</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 
</web-app> 

Espero que pueda ser útil. Actualizar esquema a Spring 3.0. Ver la documentación de referencia de Spring. mvc schema, Hasta donde yo sé, es compatible solo en Spring 3.0. Tenga esto en cuenta

+0

Esto es exactamente lo que estaba buscando. Muy bien explicado esp. la convención sobre la parte de configuración. – coolscitist

Cuestiones relacionadas