• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

burncd

Glassfish acesso remoto do dominio2 ao dominio1

2 mensagens neste tópico

Boa noite pessoal.

O dia já vai longo em frente ao computador e deparei-me a esta hora com uma duvida a qual não acho nenhum solução. A situação é a seguinte. Estou a elaborar um projecto que requer ligações remotas de um projecto a outro.

Um deles, o que tem as conexões a Base de dados, está no dominio1 do glassfish e o que vai aceder a este remotamente está no dominio2. Isto porquê... porque os projectos vão estar em computadores diferentes e a maneira mais facil de testar isto é em projectos separados em dominios separados para o obrigar a aceder remotamente um ao outro.

As conexões a BD do projecto1 estão todas OK e 100% funcionais.

O problema é quando tento aceder com o Projecto2 ao 1 deparo-me com a seguinte mensagem.

javax.ejb.EJBException: nested exception is: java.rmi.MarshalException: CORBA MARSHAL 1398079695 No; nested exception is: org.omg.CORBA.MARSHAL:  vmcid: SUN  minor code: 207  completed: No

Segui o tuturial no wiki do netbeans, http://wiki.netbeans.orgCreatingEJB3UsingNetbeansAndGlassfish, como base da ideia para o projecto.

Será que me podem indicar o que possa estar errado? (o ficheiro jndi.properties está igual ao que o tutorial diz)

# To change this template, choose Tools | Templates
# and open the template in the editor.
java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs = com.sun.enterprise.naming
java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
#optional.  Defaults to localhost.  Only needed if web server is running
#on a different host than the appserver
org.omg.CORBA.ORBInitialHost = localhost
#optional.  Defaults to 3700.  Only needed if target orb port is not 3700.
org.omg.CORBA.ORBInitialPort = 3700

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas pessoal.

Após algumas horas de dedicação e pesquisa sobre a respectiva excepção, descobri então qual é o problema.

No exemplo do website do Netbeans está tudo a funcionar como deve de ser, mas claro que se queremos aceder remotamente do domínio 2 para o domínio 1 vamos ter que ter 2 domínios criados no glassfish e a porta que vai ficar no jndi.properties é a porta que está aberta no domínio que se pretende aceder remotamente. (No meu caso escolhi alojar o projecto que vai ser acedido remotamente no domínio 1 pois a porta é a 3700 tal e qual como no exemplo, sendo assim só copiar e colar as propriedades do jndi.properties na aplicação2).

A minha aplicação que vai ser acedida remotamente não devolve uma string "a força" como no exemplo no wiki do Netbeans, mas sim uma Collection de Employee ou apenas um objecto Employee, requer que esta implemente a interface Serializable.

Classe Employee (Aplicação a ser acedida remotamente)

import java.io.Serializable;
import java.sql.Date;

public class Employee implements Serializable{

    private int identifier;
    private String name;
    private Date submissionDate;

Aplicação para Aceder Remotamente

No EJB

jndi.properties

java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs = com.sun.enterprise.naming
java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
#optional.  Defaults to localhost.  Only needed if web server is running
#on a different host than the appserver
org.omg.CORBA.ORBInitialHost = localhost
#optional.  Defaults to 3700.  Only needed if target orb port is not 3700.
org.omg.CORBA.ORBInitialPort = 3700

Minha servlet, no projecto WEB

import ejb.EmployeeSessionLocal;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EmployeeServlet extends HttpServlet implements Serializable {

    @EJB
    private EmployeeSessionLocal employeeSessionBean;

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //Employee emp = this.employeeSessionBean.selectOneEmployee(1);
        try {
            ///TODO output your page here
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet EmployeeServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet EmployeeServlet at " + request.getContextPath() + "</h1>");
            for (estg.dae.dao.employees.Employee emp : this.employeeSessionBean.selectEmployees()) {
                out.println(emp.toString());
                out.println("<br/>");
            }
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

Podem reparar que na minha servlet apenas acedo localmente pois a ligação remota é tratada no projecto EJB no SessionBean.

Como tinha referido acima, ao fazer com que a classe Employee implemente a interface Serializable consigo obter os dados do lado da aplicação2.

resultadoremote.th.png

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora