Error unmarshalling xml in java - 8 " secure-processing org.xml.sax.Saxnotrecognized Exception causing java.lang.IllegalStateException"

Poniższy kod działał poprawnie w Javie 7

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

String xmlString = '<xml ..... ';

StringReader reader = new StringReader(xmlString);

JAXBContext jc = JAXBContext.newInstance(MyClass.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
MyClass myClass = (MyClass) unmarshaller.unmarshal(reader);
....

Teraz musieliśmy upgrade do Javy 8 i teraz dostaję ten wyjątek podczas wykonywania kodu:

Sep 03, 2014 1:42:47 PM com.sun.xml.internal.bind.v2.util.XmlFactory createParserFactory
SCHWERWIEGEND: null
org.xml.sax.SAXNotRecognizedException: Feature: http://javax.xml.XMLConstants/feature/secure-processing
    at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:100)
    at com.sun.xml.internal.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:114)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.getXMLReader(UnmarshallerImpl.java:139)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:214)

Wiem, że istnieje pytanie dotyczące podobnego problemu, ale powrót do java 7 nie jest dla mnie rozwiązaniem.

Próbowałem dodać następującą zależność Mavena

<dependency>
    <groupId>javax.xml</groupId>
    <artifactId>jaxp-api</artifactId>
    <version>1.4</version>
</dependency>

Ale to nie zmieniło wyniku, więc usunąłem (dzięki @ BlaiseDoughan za informację, że to jest zawarte w Java 6)

Wszelkie wskazówki są mile widziane, Wielkie dzięki.
Author: Community, 2014-09-03

12 answers

Mieliśmy podobny problem - nasz główny programista znalazł rozwiązanie, które działa dla nas.

Dodaliśmy tę zależność do kilku naszych pom.pliki xml Dla tych, którym zależy, testy jednostkowe w Sonarze, które zawodziły, najwyraźniej zawodziły, ponieważ Cobatura domyślnie ściąga starą wersję xerces. Wersja, którą ściąga, jest niezgodna z JAX-B w Javie 8. Biblioteka nie jest używana w kodzie produkcyjnym - tylko Cobatura. Dlatego poprawka polegała na dodaniu zależności testowej od bardziej najnowsza wersja xerces (2.11.0). Odbywa się to poprzez dodanie zależności do pliku pom:
<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.11.0</version>
    <scope>test</scope>
</dependency>
 51
Author: Robert H.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-14 17:34:44

Xerces impl jest tutaj głównym winowajcą. Usuń to. Jdk ma wbudowany parser jaxb, nie potrzebujesz tego.

Więc, jeśli ta zależność pochodzi od projektu nadrzędnego w przypadku Mavena użyj zakładki wykluczenia, Jeśli nie możesz jej bezpośrednio usunąć.

<exclusion>
                 <groupId>xerces</groupId>  
            <artifactId>xercesImpl</artifactId> 
                </exclusion>

Powodem, dla którego ten problem jest tak trudny do wykrycia, jest to, że gdy Zwykle piszesz kod JAXB unmarshalling

Zrobisz unmarshalling na bloku try, a następnie złapiesz wyjątek jaxb, a następnie zrobisz cokolwiek z błąd.

Ale ten Parser jar (xercesimpl) wyrzuca wyjątek runtime w środku powodując, że błąd nie Zaloguj się i zostaną wykryte tylko po starannym debugowaniu. Spójrz na poniższy fragment kodu

try {
JAXBContext context = JAXBContext.newInstance(YourClass.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            YourClass object = (YourClass)unmarshaller.unmarshal(new StringReader("SomeXmlInString"));


}

catch (JAXBException e){
e.printStackTrace();

}

Tutaj xercesImpl powoduje, że unmarshaller używa innego parsera sax (zamiast zwykłego parsera jaxb) powodujące rzucenie innego wyjątku, który nie zostanie złapany w naszym bloku, który oczekuje jaxbexception lub jednej z jego podklas.

 24
Author: shashwatZing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 15:25:11

Innym możliwym rozwiązaniem jest dodanie zmiennych systemowych:

Użyłem ich w wtyczce Maven tomcat, która działała dla mnie:

<javax.xml.parsers.DocumentBuilderFactory>com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl</javax.xml.parsers.DocumentBuilderFactory>
<org.xml.sax.parser>com.sun.org.apache.xerces.internal.parsers.SAXParser</org.xml.sax.parser>
<javax.xml.parsers.SAXParserFactory>com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl</javax.xml.parsers.SAXParserFactory>

Ale powinieneś też mieć możliwość ustawienia w następujący sposób:

java -Dorg.xml.sax.parser="com.sun.org.apache.xerces.internal.parsers.SAXParser" \
-Djavax.xml.parsers.DocumentBuilderFactory="com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl" \
-Djavax.xml.parsers.SAXParserFactory="com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"

Lub nawet użyć systemu.setProperty:

System.setProperty("org.xml.sax.driver", "com.sun.org.apache.xerces.internal.parsers.SAXParser");
System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
System.setProperty("javax.xml.parsers.SAXParserFactory","com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
 18
Author: Mitch1077487,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-09 14:39:52

To był problem zależności.

Oto mój sposób na rozwiązanie problemu:

  1. Stwórz nowy projekt Mavena, z tymi prostymi kawałkami kodu, które załączyłem poniżej, program rozbił się normalnie z błędem, że struktura nie może być parsowana, co jest ok.
  2. Skopiuj zależności do pom projektu.xml, teraz program powinien się zawiesić (jak opisano powyżej)

  3. Nie usuwasz zależności po wybranej przez Ciebie metodzie (dobre zgadywanie, Bisekcja , 1 na 1 ..), aby znaleźć" złą " zależność. Może ktoś ma lepszą (bardziej profesjonalną) metodę, ta mi się sprawdziła.

Teraz możesz określić, co robić, może dostępna jest nowa wersja, w naszym przypadku był to własny pakiet kolegi, w którym zawierał pakiet kolegi, który mógłbym wykluczyć.

public class Test {
    public Test() {
    }
    public static void main(String[] args) {
        try {
            StringReader reader = new StringReader("<xml></xml>");
            JAXBContext jc = JAXBContext.newInstance(TestXML.class);
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            TestXML testXMLs = (TestXML) unmarshaller.unmarshal(reader);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

I klasa testXML

@XmlRootElement(name="rss")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestXML {   
    public TestXML() {
    }

    @XmlElementWrapper(name="channel")
    @XmlElement(name="item")
    private int i ;

    public int getI() {
        return i;
    }    
    public void setI(int i) {
        this.i = i;
    }
}

BTW: w moim przypadku to było

<dependency>
    <groupId>jcs</groupId>
    <artifactId>jcs</artifactId>
    <version>1.3</version>
</dependency>
Mam nadzieję, że to pomoże.
 9
Author: mmx73,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-03 18:36:42

Implementacja JAXB została włączona do Java SE od wersji 6. Jeśli usuniesz zależność od Mavena (która prawdopodobnie powoduje konflikt wersji), wszystko powinno działać.

 5
Author: bdoughan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-03 12:33:02

Odpowiedzi Bernarda i Blaise ' a były bardzo pomocne. W moim przypadku, ponieważ używam JDK 7, rozwiązaniem było wykluczenie sub zależności xerces, która była uwzględniana przez jedną z moich zależności:

<dependency>
  <groupId>org.apache.axis</groupId>
  <artifactId>axis</artifactId>
  <version>1.4.1-SNAPSHOT</version>
  <exclusions>
    <exclusion>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
    </exclusion>
    <exclusion>
      <groupId>xerces</groupId>
      <artifactId>xmlParserAPIs</artifactId>
    </exclusion>
  </exclusions>
</dependency>
 5
Author: pimlottc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-04 16:36:40

Rozwiązałem ten problem w moim projekcie z drugim rozwiązaniem Mitcha, ale tylko z

java -Djavax.xml.parsers.SAXParserFactory="com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"
 2
Author: foxpaps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-30 11:45:18

Używanie Saxparsera może być koszmarem. Jest to najczęściej używany parser XML w Javie i każdy z nich korzysta bezpośrednio lub pośrednio. JDK 8 mają JAXB już dostępne . Więc jeśli używasz JDK 8, to jedynym możliwym sposobem powinno być usunięcie zależności maven. Miałem również ten problem, więc próbowałem usunąć zależność maven, ale się nie stało. Potem pomyślałem, dlaczego nie wrócić do starszej wersji, jeśli java i VOILLA odniosłem sukces. Obecnie używam jdk 7 i moje testy działają gładko. To chyba jedyne rozwiązanie.

 1
Author: Naveen Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 20:17:29

Spróbuj utworzyć dokument XML i go usunąć. Dla mnie to zadziałało. JAXBContext jc = JAXBContext.newInstance( wiadomość.class);

        InputStream stream = new ByteArrayInputStream( string.getBytes( StandardCharsets.UTF_8 ) );
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse( stream );

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Message msg = ( Message ) unmarshaller.unmarshal( doc );
 1
Author: madhugeeth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 06:09:56

Napotkaliśmy również problem i zauważyliśmy, że musisz zachować wersję jdk i wersję jre taką samą, w przeciwnym razie będzie istniała niezgodność wersji spowodowana problemem.

Faceci, którzy spotkali problem używają jdk1. 6 i jre 1.8, po zmianie na oba jdk1.6, problem zniknął.

 0
Author: James Liu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-22 06:16:19

Miałem do czynienia z podobnym problemem, ten problem występuje, gdy istnieje duża różnica w wersjach xerces jar i xercesimpl jar. Aby to rozwiązać, użyłem xerces-2.9.0 i xercesImpl-2.9.1 i problem zniknął.

 0
Author: Mahendra Andhale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 13:07:48

Miałem podobny problem podczas próby rozwiązania luki sonaru java:S2755.

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // added (for sonar)
schemaFactory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // added (for sonar)

Po dodaniu tych dwóch linii pierwsze setProperty() wywołanie rzuciło SAXNotRecognizedException.

Wydaje mi się, że stało się tak dlatego, że dostępnych było wiele implementacji XMLSchemaFactory, z których jedna została włączona do JDK.

Moim rozwiązaniem było uruchomienie mvn dependency:tree w projekcie i poszukiwanie jakichkolwiek wystąpień "xerces". Znalazłem dwie zależności, które wykluczyłem ze wszystkich zależności, które ich używały:

<dependency>
    <!-- ... -->
    <exclusions>
        <exclusion>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <!-- ... -->
    <exclusions>
        <exclusion>
            <groupId>com.rackspace.apache</groupId>
            <artifactId>xerces2-xsd11</artifactId>
        </exclusion>
    </exclusions>
</dependency>
 0
Author: Plumstone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-08 15:30:57