0

フロントエンドJSF/RichFaces、Middle Tier Spring、HibernateforDBを備えたWebアプリを使用しました。アプリをデプロイしてシステムからアクセスし、友達がアクセスすると、友達は私が行った操作を何でも続行できました(オブジェクトはシングルトン/アプリケーションコンテキストとして動作していました)。以下は私のセッションクラス、web.xml、faces-config.xml、spring.xmlのコードです。同じ理由で、ビュースコープのBeanも私の期待どおりに動作していないと思います。この場合、誰かが助けてくれますか。

package org.kp.business;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@SessionScoped
public class OliHolder implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Map<String, ArrayList<OliData>> oliTypesHolder = new HashMap<String, ArrayList<OliData>>();


    public void addOli(String oliType) {
        OliData oliDetails = new OliData();
        oliDetails.setOliName(oliType);
        oliDetails.initData(oliType);
        ArrayList<OliData> tempHolder = null;
        if(!oliTypesHolder.containsKey(oliType))
        {
            tempHolder = new ArrayList<OliData>();
            tempHolder.add(oliDetails);
            oliTypesHolder.put(oliType, tempHolder);
        }else{
            tempHolder = oliTypesHolder.get(oliType);
            tempHolder.add(oliDetails);
        }
    }

    public void deleOli(int num, String oliType) {
        ArrayList<OliData> list = oliTypesHolder.get(oliType);
        if(null != list && list.size() > 0){
            if((list.size()>num)){  
                list.remove(num);
            }
        }
    }

    public void resetOliHolder(){
        oliTypesHolder.clear();
    }

    public List<OliData> getOlisByType(String oliType){
        ArrayList<OliData> tempHolder = oliTypesHolder.get(oliType);
        return tempHolder;
    }

    public void resetCurrentType(String selectedOli) {
         oliTypesHolder.remove(selectedOli);
    }

    public Map<String, ArrayList<OliData>> getOliTypesHolder() {
        return oliTypesHolder;
    }

}

Face-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"
    version="2.1">

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>

</faces-config>

web.xml

<?xml version="1.0"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <display-name>EBMMaker</display-name>
    <!-- <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>org.richfaces.skin</param-name>
        <param-value>ruby</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/SpringConfig.xml</param-value>
    </context-param>
    <listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
</web-app>

Spring.xml

    <?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"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

        <context:annotation-config />
        <context:component-scan base-package="org.kp"></context:component-scan>

        <bean id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost:3306/ebm" />
            <property name="username" value="root" />
            <property name="password" value="root" />
        </bean>
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="packagesToScan" value="örg.kp.db.model" />
            <property name="configLocation">
                <value>
                    classpath:/org/kp/db/hibernate.cfg.xml
                </value>
            </property>
        </bean>

</beans>

これは、データベースからデータを取得するために使用されるbbOli Beanにアクセスしようとした1つのクラスです。オブジェクトを手動で作成しているため、アプリケーションコンテキストを使用してbbOliBeanにアクセスしています。OLIDataオブジェクトのスコープがわかりません。

package org.kp.business;

import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import org.kp.db.model.TblEBMFieldDetails;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class OliData {

    BusinessOli bbOli;

    private String oliName;

    public OliData() {
        ApplicationContext ctx = WebApplicationContextUtils
                .getRequiredWebApplicationContext((ServletContext) FacesContext
                        .getCurrentInstance().getExternalContext().getContext());
        bbOli = (BusinessOli) ctx.getBean("bbOli");
    }

    private String commentText;


    public String getCommentText() {
        return commentText;
    }

    public void setCommentText(String commentText) {
        this.commentText = commentText;
    }

    public String getOliName() {
        return oliName;
    }

    public void setOliName(String oliName) {
        this.oliName = oliName;
    }

    private List<TblEBMFieldDetails> dbEBMData;
    private List<EBMDataForView> renderEBMData;

    public List<EBMDataForView> getRenderEBMData() {
        return renderEBMData;
    }

    public void setRenderEBMData(List<EBMDataForView> renderEBMData) {
        this.renderEBMData = renderEBMData;
    }

    public List<TblEBMFieldDetails> getDbEBMData() {
        return dbEBMData;
    }

    public void setDbEBMData(List<TblEBMFieldDetails> dbEBMData) {
        this.dbEBMData = dbEBMData;
    }

    public void initData(String oliName) {
        this.dbEBMData = bbOli.getOliTypeSpfcData(oliName);
        renderEBMData = new ArrayList<EBMDataForView>();
        for (TblEBMFieldDetails dt : dbEBMData) {
            EBMDataForView data = new EBMDataForView();
            data.setCmplxFlg(dt.isCollectionFlg());
            if (dt.isCollectionFlg() && null != dt.getValues()) {
                data.setFieldCollectionValue(dt.getValues().split(","));
                System.out.println("Hey I'm: "+data.getFieldCollectionValue().length);
            }

            data.setFieldDefaultValue(dt.getDefaultValue());
            data.setFieldName(dt.getFieldName());
            data.setRequiredFld(dt.isReqFlg());
            renderEBMData.add(data);
        }
    }

}

変更後

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

@ManagedBean(name = "bbOliHolder")
@ViewScoped
public class OliHolderBacking implements Serializable{


    private static final long serialVersionUID = 1L;

    private String selectedTab;

    @Autowired
    BusinessOli bbOli;

    public BusinessOli getBbOli() {
        return bbOli;
    }


    public void setBbOli(BusinessOli bbOli) {
        this.bbOli = bbOli;
    }

    @Autowired
    OliHolder oliHolder;

    private String[] allOliTypes = null;


    @PostConstruct
    public void init() {

        allOliTypes = getBbOli().getAllOlisFromDB();
        olis = new ArrayList<OliData>();
    }

}

サービスレイヤーBean

import java.util.List;

import org.kp.db.dao.EBMDetailDao;
import org.kp.db.dao.impl.OlisImpl;
import org.kp.db.model.TblEBMFieldDetails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service("bbOli")
@Scope("prototype")
public class BusinessOli{

    @Autowired
    OlisImpl olisImpl;

    @Autowired
    EBMDetailDao ebmData;

    public String[] getAllOlisFromDB() {

        String[] str = olisImpl.getAllOlis();
        return str;
    }
}

ただし、BusinessOliの自動配線は、変更前は以前に機能していました。

4

2 に答える 2

1

私の知る限り、SpringはJava EE 6(JSR 299)で導入されたCDIアノテーションをサポートしていないため、Springアノテーションを使用してBeanのスコープを定義する必要があります。

import org.springframework.context.annotation.Scope;

@Scope("session")

あなたの場合、Springはデフォルトのスコープを使用しました。これは実際にはシングルトンです。

于 2013-03-06T14:32:18.943 に答える
0

SpringとJSFを一緒に使用する場合は、JSFマネージドBeanの代わりにSpringBeanを使用すると便利です。Spring Beanは、JSFマネージドBeanのほぼすべての機能を提供し、それに加えて、非常に多くの便利なSpring機能(AOP、プロキシ、ウィービング、MessageSourcesなど)を追加します。

Spring Beanを使用する場合は、以下にリストされているSpringスコープを使用する必要がありますWebApplicationContext

import org.springframework.context.annotation.Scope;
import org.springframework.web.context.WebApplicationContext

@Scope(WebApplicationContext.SCOPE_SESSION)

スコープを見る

キャッチが1つあります。ご覧のとおり、にはありませSCOPE_VIEWWebApplicationContext。JSF 2ビュースコープは、Springではまだサポートされていません。今のところ、ビュースコープの独自の実装を提供する必要があります。それは難しいことではありません:

于 2013-03-06T16:05:05.357 に答える