JNDI bind komplexes Object

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hallo,
ich hoffe hier kann mir wer helfen.
ich versuche per JNDI ein Object abzusichern.
dafür gibt es 3 möglichkeiten, soviel ich weiß: 1- per serilisation, 2 - per attributes, 3 - per reference.

ich versuche gerade die per reference methode und das funktioniert ganz gut, nur ist mein Objekt sehr simpel gestrickt.
was muss ich tun, damit ich auch komplexere Strukturen speichern kann.
zb in der Person noch eine membervariable zb Person Partner ...

wie funktioniert das, denn ich kann anscheinend nur Strings speichern

Code:
import java.util.*;
import javax.naming.*;

public class main {    
    public static void main(String[] args) {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.sun.jndi.fscontext.RefFSContextFactory");
        env.put(Context.PROVIDER_URL, "file:/hallo/");

        try {    
       
            Context ctx = new InitialContext(env);
           
            Person p = new Person("Mustermann");
            //ctx.bind("du",p);
            ctx.rebind("du",p);            
            p = null;
            p = (Person)ctx.lookup("du");

            System.out.println(p);
            
            ctx.close();
        } catch (NamingException e) {
            System.out.println("Lookup failed: " + e);
        }
    }
}

public class Person implements Referenceable{
        private String name = null; 

        public Person(String n){
            this.name = n;
        }
        public String toString(){ return name; }

        public Reference getReference() throws NamingException{
            return new Reference(Person.class.getName(),
                                 new StringRefAddr("person",name),
                                 PersonFactory.class.getName(),
                                 null); 
        }
}

import javax.naming.spi.*;

public class PersonFactory implements ObjectFactory{
    public PersonFactory() {
    }

    public Object getObjectInstance(Object obj, Name name, Context ctx,
        Hashtable env) throws Exception {
        if (obj instanceof Reference) {
            Reference ref = (Reference)obj;
            if (ref.getClassName().equals(Person.class.getName())) {
                RefAddr addr = ref.get("person");
                if (addr != null) {
                    return new Person((String)addr.getContent());
                }
            }
        }
        return null;
    }

}
 

m-y-t-h-o-s

Mitglied
so ... ich habe es gelöst ( nach ca 3 h )

es interessiert hier sicherlich niemanden, dennoch möchte ich meine lösung posten :)

erklärung:
der unterschied zum vorrigen, ist die Sicherung eines ByteArrays
in dieses kann ich natürlich alles hineinschreiben, was ich will :D
in diesem fall serialisiere ich einfach einen container und hole ihn mir später wieder zurück.
im main gibt es keine wesentlichen änderungen.
wer will kann sich ja ganz einfach eine Personenverwaltung bauen XD...

thx 2 all und ich hoffe, dass mir nächstes mal jemand helfen kann/will :cool:

Code:
import javax.naming.*;
import javax.naming.spi.*;
import java.util.*;
import java.io.*;
import java.lang.*;

public class Person implements Referenceable{
        private String name = null;
        private int plz = 0;
        private Person Partner = null;

        public Person(String n, int plz, Person partner){
            this.name = n;
            this.plz = plz;
            this.Partner = partner;
        }
        public String toString(){ return "Name: " + name + ", Plz: " + plz + ", Partner: " + Partner; }

        public Reference getReference() throws NamingException{
            LinkedList l = new LinkedList();
            l.add(name);
            l.add(new Integer(plz));
            l.add(Partner);
            
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            try{                
                ObjectOutputStream osw = new ObjectOutputStream(baos);
                osw.writeObject(l);
                osw.close();
            }catch ( Exception e ) { System.out.println(); }
            return new Reference(Person.class.getName(),
                                 new BinaryRefAddr("person",baos.toByteArray()),
                                 PersonFactory.class.getName(),
                                 null);
        }
}

public class PersonFactory implements ObjectFactory{
    public PersonFactory() {
    }

    public Object getObjectInstance(Object obj, Name name, Context ctx,
        Hashtable env) throws Exception {
        if (obj instanceof Reference) {
            Reference ref = (Reference)obj;
            if (ref.getClassName().equals(Person.class.getName())) {
                RefAddr addr = ref.get("person");
                if (addr != null) {
                    byte[] content = (byte[])addr.getContent();
                    ByteArrayInputStream bais = new ByteArrayInputStream(content);
                    ObjectInputStream ois = new ObjectInputStream(bais);
                    LinkedList l = (LinkedList)ois.readObject();
                    ois.close();
                    Iterator i = l.listIterator();
                    return new Person((String)i.next(), ((Integer)i.next()).intValue(), (Person)i.next());
                }
            }
        }
        return null;
    }

}
:D
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben