Клиент приложения EJB Eclipse Glassfish - PullRequest
1 голос
/ 07 декабря 2010

Я использую Набор инструментов GlassFish для Eclipse .

Мне нужно создать компонент и клиент, который его тестирует. Бин (и его интерфейс) следующие.

package mykPK;

import java.math.BigDecimal;
import javax.ejb.*;

@Stateless
public class ConverterBean implements Converter {
    private BigDecimal yenRate = new BigDecimal("115.3100");

    private BigDecimal euroRate = new BigDecimal("0.0071");

    public BigDecimal dollarToYen(BigDecimal dollars) {
        BigDecimal result = dollars.multiply(yenRate);
        return result.setScale(2, BigDecimal.ROUND_UP);
    }
    public BigDecimal yenToEuro(BigDecimal yen) {
        BigDecimal result = yen.multiply(euroRate);
        return result.setScale(2, BigDecimal.ROUND_UP);
    }
}

Интерфейс:

package mykPK;

import java.math.BigDecimal;
import javax.ejb.Remote;

@Remote
public interface Converter {
    public BigDecimal dollarToYen(BigDecimal dollars);
    public BigDecimal yenToEuro(BigDecimal yen);
}

Я правильно создаю их в EJB-проекте и запускаю их "как сервер". Кажется, все начинается правильно.

Теперь я хочу создать клиента. Я попытался поместить клиента в один и тот же проект, создав другой проект («Application Client Project») или даже создав более общий «E application project» с двумя подпроектами. Результат тот же.

Теперь клиентский код выглядит следующим образом

import java.math.BigDecimal;
import javax.ejb.EJB;
import mykPK.Converter; /*of course to to that, i reference in the client project the 
EJB project*/

public class ConverterClient {
    @EJB private static Converter converter;

    public ConverterClient(String[] args) {
    }
    public static void main(String[] args) {
        ConverterClient client = new ConverterClient(args);
        client.doConversion();
    }
    public void doConversion() {
        try {
            BigDecimal param = new BigDecimal("100.00");
            BigDecimal yenAmount = converter.dollarToYen(param);
            System.out.println("$" + param + " is " + yenAmount
                    + " Yen.");
            BigDecimal euroAmount = converter.yenToEuro(yenAmount);
            System.out.println(yenAmount + " Yen is " + euroAmount
                    + " Euro.");
            System.exit(0);
        } catch (Exception ex) {
            System.err.println("Caught an unexpected exception!");
            ex.printStackTrace();
        }
    }
}

Когда я запускаю этот файл, я всегда получаю одно и то же:

Caught an unexpected exception!
java.lang.NullPointerException
    at ConverterClient.doConversion(ConverterClient.java:17)
    at ConverterClient.main(ConverterClient.java:12)

Полагаю, это потому, что мой клиент не находится в одном контейнере компонента, и он не "развернут" (я просто запускаю файл) Но когда я попробовал более общий «Enterprise Application Project», результаты были одинаковыми)

Итак, куда поместить клиента и дать ему доступ (с @EJB) к Бобу ??

Ответы [ 3 ]

0 голосов
/ 11 декабря 2010

Трассировка стека предполагает, что вы напрямую запустили основной метод.Чтобы использовать инъекцию в основном классе, необходимо использовать контейнер клиента приложения .

0 голосов
/ 28 мая 2011

Хорошим примером этой работы может быть найденный здесь Показана упаковка вашего клиента для использования с контейнером клиента приложения Glassfish (с помощью команды "appclient"), а также упаковка его как отдельного приложения Java.

0 голосов
/ 07 декабря 2010

Вы пытаетесь внедрить в неуправляемый объект.Вам нужно взять начальный контекст и посмотреть его.

Практически то же самое, что и здесь: не может найти мой компонент с помощью метода InitialContext.lookup ()

...