Wie kann ich JAXB von einem nicht signierten Applet verwenden (ohne es zu unterzeichnen)?

StackOverflow https://stackoverflow.com/questions/2084391

  •  21-09-2019
  •  | 
  •  

Frage

Ich mag marshall Java-Objekte in XML und umgekehrt aus einem Unsigned Applet und ich kann keine der Sicherheitsberechtigung / Richtliniendateien ändern oder die Anwendung signieren.

Ich scheine eine Sicherheitsausnahme zu bekommen, weil JAXB versucht, den Zugriff auf Felder oder Konstrukteuren, dass sie nicht in der Applet-Sandbox.

Der Browser läuft JRE 1.6.0_17

Ich bin auch offen für Lösungen, die auf einem anderen XML-basierten (oder JSON) -Bibliothek aber haben die folgende und ziemlich viel laufen in ein ähnliches Problem versucht;  - XStream  - Gson

Given (so etwas wie) das folgende Objekt:

@XmlType
@XmlRootElement
public class SimpleObject {

    public String sampleText;

    public SimpleObject() {
    }

    public String getSampleText() {
        return sampleText;
    }

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

Und der folgende einfache JAXB Code:

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);
    }
}

ich die folgende Ausnahme erhalten:

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)
War es hilfreich?

Lösung

Ich habe Figur nie ganz diesen heraus. Was ich tat, war stattdessen eine ziemlich einfache JSON-Bibliothek greifen Flexjson genannt. Es wirft auch eine ähnliche Sicherheitsausnahme aber die Bibliothek war einfach genug, dass ich in der Lage war, die Bibliothek Code Ausschaltzeiten, die die Ausnahme in einem Applet mit einem boolean-Flag verursacht.

Andere Tipps

Ich habe auch versucht, eine Lösung mit JAXB ohne Erfolg zu finden.

wechselte ich zu Axis2 (1.5.4) mit ADB-Bindung, aber es habe auch versucht, Systemeigenschaften zugreifen, die mit Sicherheits-Manager überprüft gescheitert.

Am Ende bekam ich eine praktikable Lösung zusammen mit AspectJ verwenden und mit einem Aspekt, der System.getProperty umschreibt () ruft null zurück, wenn sie scheitern. Da alle die Eigenschaften Axis2 waren unkritische benötigt ohnehin gearbeitet dies. Ich brauchte auch einen Aspekt über org.apache.axiom.util.stax.dialect.StAXDialectDetector.getRootUrlForResource () anzuwenden, um immer null zurück, da er versucht, einen ClassLoader.getSystemClassLoader () Aufruf zu machen, die auch im Rahmen eines Sicherheitsmanagers fehlgeschlagen. Wieder schien dies wie ein unkritischer Anruf. Got AspectJ die Axis2 Klassen zur Build-Zeit neu zu schreiben und es lief als unsigned-Applet.

Es ist eine wirklich chaotisch Lösung, aber zumindest hat es funktioniert.

Ich konnte nicht das gleiche AspectJ hacken Arbeit mit JAXB, weil JAXB direkten Zugang zu den privaten Bereichen Klassen erfordert, die nicht unter einem Sicherheitsmanager nicht fliegen, wenn JAXB mit dem Applet gebündelt wird (was brauchen wir, wenn AspectJ zu tun wird verwendet, Klassen neu zu schreiben).

Dies kann Ihr Problem lösen. Ich weiß, es gelöst Mine:)

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 es hilft

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top