bean-компонент с состоянием, ведущий себя как bean-компонент без сохранения состояния

Я новичок в EJB и пытаюсь написать реализацию для bean-компонента EJB с отслеживанием состояния, но когда я пытаюсь выполнить транзакцию, он возвращается как bean-компонент без сохранения состояния.

package beanpackage;

import javax.ejb.Stateful;
//import javax.ejb.Stateless;

/**
 * Session Bean implementation class bankbean
 */
@Stateful
public class bankbean implements bankbeanRemote, bankbeanLocal {
    /**
     * Default constructor. 
     */
    static int accountbalance;
    public bankbean() {
        accountbalance=10;
    }
    public int accountbalancecheck()
    {
        return accountbalance;
    }
    public int accountwithdraw(int amount)
    {
    return (accountbalance-amount);
    }
    public int accountdeposit(int amount)
    {
        return (accountbalance+amount);
    }
}




import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import beanpackage.bankbeanRemote;


public class appclient {
public static void main(String args[]) throws NamingException
    {
        Context c = appclient.getIntitialContext();
        bankbeanRemote bbr = (bankbeanRemote)c.lookup("bankbean/remote");
        int s = bbr.accountbalancecheck();
        System.out.print(s+"  this is first ejb output");
        s=bbr.accountwithdraw(1);
        System.out.print(s+"  this is first ejb output");
        s=bbr.accountwithdraw(1);
        System.out.print(s+"  this is first ejb output");
    }
public static Context getIntitialContext() throws NamingException
    {
        Properties prop = new Properties();
         prop.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
        prop.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
        prop.setProperty("java.naming.provider.url", "127.0.0.1:1099");
        return new InitialContext(prop);
    }
}

Результат:

10  this is first ejb output
9  this is first ejb output
9  this is first ejb output 

Я не мог понять. Он должен вернуть 10 9, затем 8.. но возвращает 10 9 9.. пожалуйста, помогите


person user1272855    schedule 09.03.2013    source источник


Ответы (2)


Вы забываете уменьшить/увеличить accountbalance. Я думаю, это то, что вы намеревались сделать:

public int accountwithdraw(int amount)
{
    accountbalance = accountbalance-amount;
    return accountbalance;
}

public int accountdeposit(int amount)
{
    accountbalance = accountbalance-amount;
    return accountbalance;
}

ps - какая-то конкретная причина, по которой вы используете аннотацию в определении ejb, но не для поиска (@EJB)? Было бы и проще, и портативнее ИМО.

person fvu    schedule 09.03.2013

Помимо ответа fvu, вы не должны делать accountbalance статическим, иначе это значение будет общим для всех экземпляров компонента.

Просто объявите это так:

int accountbalance;
person Cyrille Ka    schedule 09.03.2013