2010-01-18 13 views
2

Je souhaite placer des objets Java en XML et vice-versa à partir d'une applet non signée et je ne peux modifier aucun des fichiers d'autorisations/de règles de sécurité, ni signer l'application.Comment utiliser JAXB à partir d'une applet non signée (sans la signer)?

Je semble obtenir une exception de sécurité, car JAXB tente d'accéder à des champs ou des constructeurs qu'il ne peut pas dans le sandbox de l'applet.

Le navigateur est en cours d'exécution JRE 1.6.0_17

Je suis aussi ouvert à des solutions basées sur une autre bibliothèque XML (ou JSON), mais ont essayé ce qui suit et à peu près INTRODUISE un problème similaire; - Xstream - Gson

Given (quelque chose comme) l'objet suivant:

@XmlType 
@XmlRootElement 
public class SimpleObject { 

    public String sampleText; 

    public SimpleObject() { 
    } 

    public String getSampleText() { 
     return sampleText; 
    } 

    public void setSampleText(String sampleText) { 
     this.sampleText = sampleText; 
    } 
} 

et le simple code JAXB suivant:

public void actionPerformed(ActionEvent e) { 
    try { 
     JAXBContext jc = JAXBContext.newInstance(SimpleObject.class); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     SimpleObject object = new SimpleObject(); 
     object.setSampleText("Hello"); 

     marshaller.marshal(object, System.out); 
    } 
    catch (JAXBException e1) { 
     throw new RuntimeException(e1); 
    } 
} 

Je reçois l'exception suivante:

Exception in thread "AWT-EventQueue-2" java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkMemberAccess(Unknown Source) 
    at java.lang.Class.checkMemberAccess(Unknown Source) 
    at java.lang.Class.getDeclaredConstructor(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator.hasDefaultConstructor(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator.hasDefaultConstructor(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.<init>(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl.<init>(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.createClassInfo(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.createClassInfo(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(Unknown Source) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(Unknown Source) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at javax.xml.bind.ContextFinder.newInstance(Unknown Source) 
    at javax.xml.bind.ContextFinder.find(Unknown Source) 
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source) 
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source) 
    at nz.co.zeal.maker.application.actions.build.JAXBTestAction.actionPerformed(JAXBTestAction.java:24) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.AbstractButton.doClick(Unknown Source) 
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source) 
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

Répondre

2

Je n'ai jamais vraiment compris celui-ci. Ce que j'ai fait à la place était de prendre une bibliothèque JSON assez simple appelée Flexjson. Il a également lancé une exception de sécurité similaire, mais la bibliothèque était suffisamment simple pour que je puisse désactiver le code de bibliothèque qui provoque l'exception dans une applet avec un indicateur booléen.

0

J'ai également essayé de trouver une solution avec JAXB sans aucun succès.

Je suis passé à Axis2 (1.5.4) avec une liaison ADB, mais j'ai également essayé d'accéder aux propriétés du système qui ont échoué avec les vérifications du gestionnaire de sécurité. En fin de compte, j'ai obtenu une solution réalisable en utilisant AspectJ et en utilisant un aspect qui réécrit les appels System.getProperty() pour retourner null quand ils échouent. Puisque toutes les propriétés nécessaires à Axis2 étaient non critiques, cela a fonctionné. J'ai également dû appliquer un aspect sur org.apache.axiom.util.stax.dialect.StAXDialectDetector.getRootUrlForResource() pour toujours retourner null car il a essayé de faire un appel ClassLoader.getSystemClassLoader() qui a également échoué sous un gestionnaire de sécurité. Encore une fois, cela semblait être un appel non critique. Got AspectJ pour réécrire les classes Axis2 au moment de la construction et il a couru comme une applet non signée.

C'est une solution vraiment salissante, mais au moins cela a fonctionné.

Je ne pouvais pas obtenir le même hack AspectJ fonctionnant avec JAXB parce que JAXB nécessite un accès direct aux champs privés des classes qui ne volent pas sous un gestionnaire de sécurité si JAXB est fourni avec l'applet (ce que nous devons faire si AspectJ est utilisé pour réécrire les classes).

0

Cela peut résoudre votre problème. Je sais que le mien :) résolu

public void actionPerformed(ActionEvent e) { 
    try { 
    JAXBContext jc = AccessController.doPrivileged(new PrivilegedExceptionAction<JAXBContext>() { 

     public JAXBContext run() throws JAXBException { 

      // needs to run here otherwise throws AccessControlException 
      return JAXBContext.newInstance(SimpleObject.class); 
     } 
    });   
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     SimpleObject object = new SimpleObject(); 
     object.setSampleText("Hello"); 

     marshaller.marshal(object, System.out); 
    } 
    catch (JAXBException e1) { 
     throw new RuntimeException(e1); 
    } 
    } catch (PrivilegedActionException e2) { 
    throw new RuntimeException(e2); 
    } 
} 

Hope it helps