2014-10-10 3 views
0

Я получаю следующее сообщение об ошибке компиляции в затмении при попытке создать экземпляр ObjectFactory:не может создать экземпляр типа ObjectFactory

cannot instantiate the type objectfactory 

Эта ошибка компиляции генерируется в следующей строке:

objectFactory = new ObjectFactory();//throws error: "Cannot instantiate the type ObjectFactory" 

Полный код для вызывающего класса выглядит следующим образом:

package maintest; 

import java.io.File; 
import javax.naming.spi.ObjectFactory; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 

public class Main { 

    private static JAXBContext context; 
    private static ObjectFactory objectFactory; 

    public static void main(String[] args) { 
     try {setUp();} catch (Exception e) {e.printStackTrace();} 
     unmarshal(); 
    } 

    protected static void setUp() throws Exception { 
     context = JAXBContext.newInstance("generated"); 
     objectFactory = new ObjectFactory();//throws error: "Cannot instantiate the type ObjectFactory" 
    } 

    public static <PurchaseOrderType> void unmarshal(){ 
     Unmarshaller unmarshaller; 
     try { 
      unmarshaller = context.createUnmarshaller(); 
      final Object object = unmarshaller.unmarshal(new File("src/test/samples/po.xml")); 
     } catch (JAXBException e) {e.printStackTrace();} 
    } 
} 

Как я могу устранить эту ошибку?

+1

'javax.naming.spi.ObjectFactory' - это интерфейс, а не класс. Вам нужно создать его реализацию. – azurefrog

+0

Какая реализация JNDI вы используете? Я ожидаю, что у его API будет какой-то способ получить объектную фабрику. – azurefrog

+0

Что вам нужно для ObjectFactory (в вашем примере нет использования)? Вы действительно хотите использовать тот из пакета javax.naming.spi, а не один, созданный с помощью xjc? – Puce

ответ

3

Я предполагаю, что вы импортировали неправильный ObjectFactory. Вероятно, вы захотели создать тот, который был создан с помощью xjc (связанный с JAXB), а не с javax.naming.spi (интерфейс поставщика услуг JNDI).

Редактировать

javax.xml.bind.JAXBException: "Генерация" оленья кожа содержит ObjectFactory.class или jaxb.index

Убедитесь, что "создается" пакет содержит либо ObjectFactory (тот, который содержит аннотацию @XmlRegistry, а не реализацию javax.naming.spi.ObjectFactory) или файл jaxb.index.

Возможно, вы удалите java.naming.spi.ObjectFactory из своего кода, если только вы не реализуете реализацию JNDI самостоятельно.

+0

Вы создавали классы JAXB из XSD? Тогда в этом же пакете должен быть объект ObjectFactory. Используйте это. (Но это необходимо только в том случае, если вам нужно создать JAXBElements. В противном случае просто удалите объект ObjectFactory (а не класс) из вашего кода.) – Puce

+0

Если вы сами пишете классы JAXB, а не генерируете их, ознакомьтесь со следующим вопрос: http://stackoverflow.com/questions/5780184/what-is-the-objectfactory-role-during-jaxb-unmarshalling – Puce

+0

Если вы создали классы с помощью maven-jaxb2-plugin, то Eclipse должен увидеть его, из коробки, AFAIK. Может быть, просто попробуйте переосмыслить проект (как проект Maven). – Puce

1

Попробуйте следующее

import javax.naming.spi.ObjectFactory; 
    import javax.naming.Context; 
    import javax.naming.Name; 
    import java.util.Hashtable; 

    ObjectFactory objFactory = new ObjectFactory() { 

    @Override 
    public Object getObjectInstance(Object o, Name name, Context cntxt, Hashtable<?, ?> hshtbl) throws Exception { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 
}; 
+0

Я в Netbeans, но я добавил импорт, необходимый для Name, Context и Hashtable в моем ответе. – Sybren

+0

+1 и благодарю вас за помощь. – CodeMed

+0

Нет проблем, ваш прием – Sybren

Смежные вопросы