0

プロジェクトではSpring3でJSF2を使用していますが、これまではリクエストスコープとセッションスコープのみを使用しています。一部のJSFBeanにビュースコープを使用したい(複数の理由で)。

問題は、JSFManagedBeanがSerializableインターフェースとそのすべてのプロパティを実装する必要があることです。

Spring BeanのSerializables(例:VilleService ...)を取得するのは難しいです。これは、シリアル化が不可能な場合でも(hibernateクラスまたはmysql ...)、さらに多くのクラスをシリアル化できるように要求し続けるためです。

次に例を示します。

public class VilleBean extends BaseBean implements Serializable {

    private Ville ville;
    private List<Ville> villes;
    private VilleService villeService;
    private PaysService paysService;
    private Pays pays;
    private List<Pays> payss;
    private PojoConverter<Pays> paysConverter = null;

    public VilleBean() {
        ville = new Ville();
        pays = new Pays();
    }

    public void setVilleService(VilleService villeService) {
        this.villeService = villeService;
    }

    public void setPaysService(PaysService paysService) {
        this.paysService = paysService;
    }

    // getters and setters for attributes : ville, pays, villes, payss


    public void addVilleAction() {
         ville.setPays(pays);
         villeService.create(ville);
    }

    public void deleteVilleAction(Ville ville) {
         villeService.delete(ville);
         villes = villeService.readAll();
    }

    public void updateVilleAction() {
         ville.setPays(pays);
         villeService.update(ville);
    }

    public PojoConverter<Pays> getPaysConverter() {
        this.paysConverter = new PojoConverter<Pays>(getPayss());
        return this.paysConverter;
    }
}



public abstract class BaseBean {
    protected FacesContext context = FacesContext.getCurrentInstance();
    protected MessageFactory msg;
    protected static final Logger log = Logger.getLogger(BaseBean.class);
}

POJO:

public class Ville implements Serializable {

    private int id;
    private String intitule;
    private Pays pays;

// setters and getters
}

public class Pays implements Serializable {

    private int id;
    private String intitule;

// setters and getters
}

サービスインターフェース:

public interface VilleService extends ICrud<Ville> {

}

サービス実装:

public class VilleServiceBase implements VilleService {

private IDao<Ville> dao;

// getter and setter for dao

@Override
public List<Ville> readAll() throws Exception {
       return dao.readAll();
}

@Override
public void create(Ville entity) throws Exception {
        dao.create(entity);
}
//****

Util:

public interface ICrud<T> {

public java.util.List readAll() throws Exception;
public void create(T entity) throws Exception;
public void update(T entity) throws Exception;
//****

public interface IDao<T> {

public java.util.List<T> readAll();
public T create(T entity);
//****

public class DaoBase<T> extends org.springframework.orm.hibernate3.support.HibernateDaoSupport implements IDao<T> {

private final Class<T> type;

public DaoBase(Class<T> type) {
      this.type = type;
}

@Override
public T load(int id) {
        return (T) this.getHibernateTemplate().get(this.type, new Integer(id));
}

@Override
public T create(T entity) {
     //****
       this.getHibernateTemplate().save(entity);
       return entity;
}

春の豆:spring.xml:

 <!-- Ville Service Implementation  -->
<bean id="villeServiceBase" class="commun.ref.crud.VilleServiceBase">
    <property name="dao">
        <ref bean="villeDao"/>
    </property>
</bean>
<!-- Ville Service Proxy  -->
<bean id="villeService" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target">
        <ref local="villeServiceBase"/>
    </property>
    <property name="proxyInterfaces">
        <value>commun.ref.crud.VilleService</value>
    </property>
    <property name="interceptorNames">
        <list>
            <value>manageableServiceTransactionInterceptor</value>
            <value>hibernateInterceptor</value>
        </list>
    </property>
</bean>

<bean id="villeDao" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target">
        <bean class="smile.util.DaoBase">
            <constructor-arg>
                <value>commun.ref.Ville</value>
            </constructor-arg>
            <property name="sessionFactory">
                <ref bean="sessionFactory"/>
            </property>
        </bean>
    </property>
    <property name="proxyInterfaces">
        <value>smile.util.IDao</value>
    </property>
    <property name="interceptorNames">
        <list>
            <value>hibernateInterceptor</value>
        </list>
    </property>
</bean>

JSF構成:faces-config.xml:

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

<application>
    <variable-resolver>
        org.springframework.web.jsf.DelegatingVariableResolver
    </variable-resolver>
</application>

    ******

<managed-bean> 
    <managed-bean-name>villeBean</managed-bean-name>
    <managed-bean-class>commun.ref.ui.VilleBean</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
    <managed-property>
        <property-name>villeService</property-name>
        <value>#{villeService}</value>
    </managed-property>
    <managed-property>
        <property-name>paysService</property-name>
        <value>#{paysService}</value>
    </managed-property>
</managed-bean>

これを機能させるために何をすべきか教えてください。

4

2 に答える 2

1

シリアル化したくない、またはシリアル化できないフィールドでは、transient修飾子を使用します。例えば:

private transient VilleService villeService;

MyFacesを使用しているので、次のパラメーターをweb.xmlに追加します。

<context-param>
  <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
  <param-value>false</param-value>
</context-param>

私が知っているように、このパラメータはfalseMojarraのデフォルトです。これにより、セッションの状態のシリアル化が無効になります。

于 2013-03-20T12:14:49.207 に答える
0

セッションパッシベーションを使用しない場合はtransient、シリアル化できないフィールドに属性を使用できます。

例えば:

private transient Connection connection;
于 2013-03-20T12:15:27.023 に答える