AspectJ Injection в Vaadin работает только после того, как я сгенерировал SerialVersionID - PullRequest
1 голос
/ 26 августа 2011

Привет, я использую Spring 3 + Spring MVC (половина сайта) + Vaadin + AspectJ + JPA2 + Spring Security

Моя проблема в том, что Spring создает все мои репозитории, и я хотел бы поделиться ими с Vaadin, используя инъекцию AspectJ с Spring Annotations, когда vaadin запущен (часть администратора сайта)

Мне удалось заставить все это работать через пару дней, я могу использовать аннотацию @Configurable Spring в моем контроллере Vaadin, чтобы он мог автоматически вводиться с моими репозиториями контекста Spring,

Кстати, я использую ткачество во время компиляции с подключаемыми модулями maven, codehaus и AspectJ eclipse, чтобы tomcat мог получить необходимые библиотеки.

НО ...

Иногда это работает, иногда нет ...

Я обнаружил, что когда я добавляю сериализуемый интерфейс к своим репозиториям, он работает, но только если я прошу сгенерировать serialId, а затем запустить приложение (tomcat) сразу после него, если я внесу какие-либо изменения и соберу его заново впрыска больше нет.

Мой конфиг и Классы ...

часть, которая, как мне кажется, имеет значение для моего приложенияContext.xml

   .
   .
   Other stuff

    <context:spring-configured />
    <context:component-scan base-package="br.com.gsc" />
    <mvc:annotation-driven />
    <tx:annotation-driven transaction-manager="transactionManager"/>

   .
   .
   Other stuff

вот сервлет Vaadin

package br.com.gsc.vaadin;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;

import br.com.gsc.model.tableMapping.Person;
import br.com.gsc.repository.objRepos.PersonRepository;

import com.vaadin.Application;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Window;


@Configurable(preConstruction=true,autowire=Autowire.BY_TYPE)
public class VaadinOperatorServlet extends Application {


/**
     * 
     */
    private static final long serialVersionUID = -1481084776783567319L;

    @Autowired
    private transient PersonRepository pRepo;

    public void init() {
        createWindow();
    }

    public void createWindow(){
        Window window = new Window();
        Panel p = new Panel();
        Label l = new Label("Teste");
        Label l2 = new Label("");
        Label l3 = new Label("");

        Person person = pRepo.findPersonByID("user");
        l2 = new Label(person.getUsername());
        p.addComponent(l);
        p.addComponent(l2);
        window.addComponent(p);
        setMainWindow(window);
        window.getContent().setSizeFull();  
    }
}

Мой репо

package br.com.gsc.repository.objRepos;

import java.io.Serializable;
import java.util.List;

import org.springframework.stereotype.Repository;

import br.com.gsc.model.tableMapping.Person;
import br.com.gsc.repository.AbsRepository;
import br.com.gsc.repository.objInterfaces.IPersonRepository;

@Repository
public class PersonRepository extends AbsRepository<Person> implements IPersonRepository,Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -8520715359024018210L;

    @Override
    public void addPerson(Person t) {
        add(t);
    }

    Lot's of other stuff....



}

Web.xml с маршрутизацией сервлетов и другими вещами.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>GSC</display-name>
    <welcome-file-list>
        <welcome-file>/intern.html</welcome-file>
    </welcome-file-list>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

      <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
      </listener>

<!-- Vaadin production mode -->
    <context-param>
        <param-name>productionMode</param-name>
        <param-value>false</param-value>
    </context-param>

<!--    SERVLETS     -->
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>    
    <servlet>
        <servlet-name>vaadinServlet</servlet-name>
        <servlet-class>com.vaadin.terminal.gwt.server.ApplicationServlet</servlet-class>
        <init-param>
            <param-name>application</param-name>
            <param-value>br.com.gsc.vaadin.VaadinOperatorServlet</param-value>
        </init-param>
        <init-param>
            <description>Application widgetset</description>
            <param-name>widgetset</param-name>
            <param-value>br.com.gsc.vaadin.widgetset.GscWidgetset</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

<!--    SERVLET MAPPINGS -->
    <servlet-mapping>
        <servlet-name>vaadinServlet</servlet-name>
        <url-pattern>/admin/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>vaadinServlet</servlet-name>
        <url-pattern>/oper/*</url-pattern>
    </servlet-mapping>   
    <servlet-mapping>
          <servlet-name>vaadinServlet</servlet-name>
          <url-pattern>/VAADIN/*</url-pattern>
    </servlet-mapping> 
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>        

<!--  Filter OpenSession     -->   
    <filter>  
      <filter-name>openEntityManager</filter-name>   
      <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>   
    </filter>  
    <filter-mapping>  
      <filter-name>openEntityManager</filter-name>   
      <url-pattern>/*</url-pattern>   
    </filter-mapping>  
<!--  Filter OpenSession  -->

    <!--  Filter Security  -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--  Filter Security -->

    <!-- Filter HTTP Methods -->
    <filter>
        <filter-name>httpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>httpMethodFilter</filter-name>
        <servlet-name>spring</servlet-name>
    </filter-mapping>
    <!-- Filter HTTP Methods -->
</web-app>

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Похоже, у нас возникла проблема, когда мы правильно настроили maven для создания во время компиляции наших @ Configurable, но Eclipse не сделал этого автоматически. Это особенность плагина m2eclipse в eclipse, которого мне не хватает. Потому что вы правильно определили jar аспектов аспектов в пути аспектов в файле pom, но eclipse также не знает, как это сделать. Поэтому нам пришлось вручную добавить фасет AOP в ваш проект, который содержит @Configurables, а затем сконфигурировать его, чтобы добавить spring-aspect.jar в качестве пути аспектов. Затем, когда Eclipse компилируется, аспекты сплетаются, и когда вы запускаете ваш кот из Eclipse, ваш кот будет использовать тканые классы вместо нетканых классов.

0 голосов
/ 05 сентября 2011

Ну, я никак не мог это исправить ...

Я наконец-то использовал Spring roo для создания веб-приложения maven и вставил туда все свои коды и конфиги, потому что я знал, что Roo работает из коробкис аспектами.

Теперь это работает ... но я понятия не имею, почему мой последний проект имел эту проблему с DI вне Spring Context.

...