일부 OSGi 번들을 만들었습니다. 이들 중 하나에는 XStream을 사용하여 데이터를 xml로 내보내는 기능이 있습니다. 그냥 잘 작동합니다. 번들을 라이브러리로 사용하고 OSGi 컨텍스트가 아닌 경우에도 다시 가져 오기가 가능합니다.OSGi (Java 1.4)에서 XStream을 사용하여 XML 비 직렬화가 작동하지 않음
---- Debugging information ----
message : Cannot find class ChildDate
cause-exception : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message : Cannot find class ChildData
class : ChildData
required-type : ChildData
path : /ParentData/ChildData
-------------------------------
message : Could not call ParentData.readObject()
cause-exception : com.thoughtworks.xstream.converters.ConversionException
cause-message : Cannot find class ParentData : Cannot find class ChildData
class : ParentData
required-type : ChildData
path : /ParentData/ChildData
-------------------------------
내가이 비슷한 문제를 생각 : 나는 다른 번들에서 내 가져 오기를 호출하는 경우
는하지만 밖으로 인쇄 follwing을 디버깅 정보와 "com.thoughtworks.xstream.converters.ConversionException"를 얻을 : XStream and OSGi 또는이 : CannotResolveClassException in OSGi environment
그래서 ClassLoader를 설정하여 해결하려고했습니다. 그러나 그것은 효과가 없습니다. 내 ParentData 클래스의
부품 :
public class ParentData implements Serializable {
// [...]
private static ClassLoader classLoaderForImport = ParentData.class.getClassLoader();
// [...]
public static void setClassLoaderForImport(ClassLoader classLoaderForImport) {
ParentData.classLoaderForImport = classLoaderForImport;
}
// [...]
public static Lumicon importFromXMLFile(String path) {
return importFromFile(new DomDriver(), path);
}
private static ParentData importFromFile(HierarchicalStreamDriver driver, String path) {
try {
XStream xstream = new XStream(driver);
//set the classloader as the default one won't work in any case
xstream.setClassLoader(ParentData.classLoaderForImport);
xstream.alias("ParentData", classLoaderForImport.loadClass(ParentData.class.getName()));//ParentData.class);
xstream.alias("ChildData", classLoaderForImport.loadClass(ChildData.class.getName()));//ChildData.class);
Reader reader = new FileReader(path);
Object object = xstream.fromXML(reader);
return (ParentData) object;
} catch (ClassNotFoundException ex) {
System.out.println("This did not work.");
} catch (FileNotFoundException e) {
System.out.println("File " + path + " not found.");
}
}
// [...]
}
기능 xstream.fromXML(reader)
이 작동하지 않지만, classLoaderForImport.loadClass(ChildData.class.getName())
이 실패하지 않습니다.
이것은 내가 다른 번들에서 호출하는 방법입니다
ParentData.setClassLoaderForImport(ParentData.class.getClassLoader());
data = ParentData.importFromXMLFile(path); // this is where the Exception happens
가 나는 또한 this.getClass().getClassLoader()
및 시도 ChildData.class.getClassLoader()
이 될 수 있을까,이 작동하지 않습니다,이 기능은 세 번째 번들에서 호출되기 때문에 ?
는 좀 더 정보 :- 자바 버전 : 1.4
- 실행 환경 (아니, 1.5 또는 1.6로 업그레이드 할 수 없습니다) : J2SE-1.6
- 메이븐 버전 : 2.2.1
- OPS4J에서 인원 러너 (1.5.0)을 실행 - http://www.ops4j.org
- 은 OSGi : 춘분 3.6.0
- XStream을 1.3.1 (com.springsource.com.thoughtworks.xstr 이메일)
도움이 될 것입니다!
"ParentData.readObject()를 호출 할 수 없습니다."이 메서드가 존재합니까? 만약 그렇다면, 우리는 그것을 볼 수 있을까요? – biziclop
오류 메시지에도 이상한 점이 있습니다. 오타가 될 수 있지만 어쩌면 단서가 될 수 있습니다. "클래스 ChildDat ** e **를 찾을 수 없습니다."는 원래 메시지에 있지만 이상하게도 원인 메시지는 아닙니다. – biziclop
@biziclop 1. readObject()가 존재하지 않습니다. 그것이 문제였습니다. 2. 네, 그건 오타였습니다 –