On 21.06.2016 22:51, Mandy Chung wrote:
On Jun 21, 2016, at 10:39 AM, Daniel Fuchs <daniel.fu...@oracle.com> wrote:
Hi,
Please find below a somewhat trivial patch for
8150173: JAXBContext.newInstance causes PrivilegedActionException
when createContext's declared in absract class extended
by discovered JAXB implementation
https://bugs.openjdk.java.net/browse/JDK-8150173
Patch:
http://cr.openjdk.java.net/~dfuchs/webrev_8150173/webrev.00
This is an oversight that was introduced with JDK-8145104.
The issue is simply that newInstance() must be invoked on
the concrete class, not on the class that defines the
createContext method.
Thanks for taking this one on.
234 if (JAXBContextFactory.class.isAssignableFrom(declaringClass)
The spec says that implementation class of JAXBContextFactory must also
implement no-arg constructor.
Line 234 seems to be even harmful for the following case:
public class FactoryBase {public JAXBContext createContext(Class<?>[]
classesToBeBound, Map<String, ?> properties) throws JAXBException
{...}public JAXBContext createContext(String contextPath, ClassLoader
classLoader, Map<String, ?> properties) throws JAXBException
{...}}public class Factory extends FactoryBase implements
JAXBContextFactory { }Please also see attached minimal testcase.
Georgiy
So I think this line is not needed. Instead instantiateProviderIfNecessary
should simply take the implClass parameter (the Method parameter doesn’t seem
to be needed).
245 throw new
JAXBException(Messages.format(Messages.COULD_NOT_INSTANTIATE, declaringClass,
e), e);
Since you are on this file, it looks to me that it should use e.getCause()
instead of e.
Mandy
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
*/
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBContextFactory;
import javax.xml.bind.JAXBException;
import java.util.Map;
/**
* @author Georgiy Rakov
*/
public class Test9 {
private static JAXBContext tmp;
public static class FactoryBase {
public JAXBContext createContext(Class<?>[] classesToBeBound,
Map<String, ?> properties) throws JAXBException {
return tmp;
}
public JAXBContext createContext(String contextPath, ClassLoader
classLoader, Map<String, ?> properties)
throws JAXBException {
return tmp;
}
}
public static class Factory extends FactoryBase implements
JAXBContextFactory {
}
public static void main(String[] args) throws JAXBException {
tmp = JAXBContext.newInstance(Test9.class);
System.setProperty(JAXBContext.JAXB_CONTEXT_FACTORY, "Test9$Factory");
JAXBContext.newInstance(Test9.class);
}
}