JForum 3 Betaテクノロジーアーキテクチャおよび具体的な問題の解決

4159 ワード

まず説明するのは、JForum 3 Betaは確かにunder heavy developmentですが、機能的にはすべてあり、自分でテストし、すべてのBugを乾かす必要があります。


一、技術アーキテクチャ

  • MVCフレーム:Vraptor 3.5
  • 依存注入:Spring 3.0.5
  • 永続化:Hibernate 3.6.10
  • ページ:jsp+jstl+el-functors+jQuery
  • 全文検索:Hibernate Search 3.2.0
  • Entities:私たちがよく使うPOJOではなく、ビジネスオブジェクトの概念に似ており、エンティティ構造にdaoオブジェクトが注入されています.
  • Vraptorを使用しているため、プロファイルは少なく、すべて約束です.SpringプロファイルはSystemGlobalsを導入するためにのみ使用する.properties,hibernateプロファイルにはデータベースとマッピングのみが割り当てられています.Vraptor自体にプロファイルはありません.

  • Entitiesのことを説明すると、JForum 3のEntityはこうです.
    @Entity
    @Table(name = "jforum_categories")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @Component
    @PrototypeScoped
    public class Category implements Serializable {
    	@Id
    	@SequenceGenerator(name = "sequence", sequenceName = "jforum_categories_seq")
    	@GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence")
    	@Column(name = "category_id")
    	private int id;
    
    	@Column(name = "category_order")
    	private int displayOrder;
    
    	@Column(name = "category_moderated")
    	private boolean moderated;
    
    	@Column(name = "category_title")
    	private String name;
    
    	@Transient
    	private CategoryRepository repository;
    
    	public Category() {}
    
    	@Autowired
    	public Category(CategoryRepository repository) {
    		this.repository = repository;
    	}
    
    	public List<Forum> getForums() {
    		return this.repository.getForums(this);
    	}
            ……
    }
  • エンティティは@Entity注記を使用しているので、Hibernate反射用に無パラメトリックコンストラクション関数が必要です.
  • ページには「${category.forums}」と書かれているので、EL式によって実体オブジェクトから直接データを取り出すことができ、直接的な感じがするので、実体には構造関数が対応するDAOオブジェクトCategoryRepositoryに注入されます.これはVraptorと少し交錯する意味であり,そのControllerの中にも構造関数注入に必要なすべてがある.
  • Vraptor3.5は2を完了することはできません.パラメータのない構造関数があるため、他の構造関数は無視されます(詳細はここを参照).そこでSpring注記を用いてCategoryRepositoryをパラメトリック構造関数に注入したが,これにより2つのSessionFactoryが出現し,1つはVraptor,1つはSpringであった.これは多分JForum 3の最も変態な場所です.....
  • Hibernateが既にオブジェクトを注入したSpringのBeanを使用できるようにするためにSpringInterceptorが登場:
  • public class SpringInterceptor extends EmptyInterceptor {
    	private final SessionFactory sessionFactory;
    	private final ApplicationContext beanRegistry;
    
    	public SpringInterceptor(ApplicationContext beanRegistry, SessionFactory sessionFactory) {
    		this.sessionFactory = sessionFactory;
    		this.beanRegistry = beanRegistry;
    	}
    
    	@Override
    	public Object instantiate(String entityName, EntityMode entityMode, Serializable id) {
    		if (!EntityMode.POJO.equals(entityMode)) {
    			return null;
    		}
    
    		Class<?> c = getClassByName(entityName);
    		Object instance = this.beanRegistry.getBean(c);
    		sessionFactory.getClassMetadata(c).setIdentifier(instance, id, EntityMode.POJO);
    
    		return instance;
    	}
    
    	private Class<?> getClassByName(String name) {
    		try {
    			return Class.forName(name);
    		} catch (ClassNotFoundException e) {
    			throw new ForumException(e);
    		}
    	}
    }

    二、具体的な問題
    1.Vraptor 3をよく見る.5のドキュメント(http://vraptor.caelum.com.br/en/docs/one-minute-guide/)は多くの時間を節約することができて、ドキュメントはとても簡素で、あまりありません.
    2.パッケージの問題はVraptor 3である.5の中のかばんは、ほとんどあります.
    3.Hibernate 3.2アップグレード後、いくつかの小さな問題が修正され、最も多かったのはuniqueResult()の結果がLong型で、Integerに転送できませんでした.
    4.JForumTagではspringContextからBeanを自分で取る必要があります.
    springContext = WebApplicationContextUtils.getRequiredWebApplicationContext(this.pageContext().getServletContext());

    5.ページに小さな問題があるので、リンクを変更すればいいです.zh_CN.propertiesにはフィールドがありません.補完すればいいです.
    6.アップロードファイルサイズの問題、Vraptor 3.5デフォルトのアップロードファイルのサイズは2メガで、再構成(コードで):
    @Component
    @ApplicationScoped
    public class CustomMultipartConfig extends DefaultMultipartConfig{
        public long getSizeLimit() {
            return 50 * 1024 * 1024; // 50MB
        }
    }