我正在Eclipse中编写Web应用程序,我正在使用XStream序列化库来生成My JSON.
我已经封装了在我的servelet调用的类中构建JSON的代码.然后封装类有一个主要的测试方法,当我运行它时,一切似乎工作正常.
但是,当我使用调用我的servelet中的类时,我收到一个java.lang.NoClassDefFoundError错误,说我没有加载XStream库.我假设我的构建路径错误,但我已将XStream库设置为项目的构建路径,因此据我所知它应该可行.
这里可能出现什么问题?
以下是确切的例外:
java.lang.ClassNotFoundException: com.thoughtworks.xstream.io.HierarchicalStreamDriver
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at SecurePaymentAjaxData.doPost(SecurePaymentAjaxData.java:44)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)
这是使用xstream类的相关代码:
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("CallDataUpdate", CallDataUpdate.class);
xstream.alias("CardStatus", CardStatus.class);
String jsonData = xstream.toXML(updateData);
Run Code Online (Sandbox Code Playgroud)
我强调这个代码在作为java应用程序运行时工作正常,我确定它与加载库有关,我只是不知道我哪里出错了.
这段代码:
println(new XStream.toXML(List(1,2,3)))
Run Code Online (Sandbox Code Playgroud)
生成这个XML:
<scala.coloncolon serialization="custom">
<unserializable-parents/>
<scala.coloncolon>
<int>1</int>
<int>2</int>
<int>3</int>
<scala.ListSerializeEnd/>
</scala.coloncolon>
</scala.coloncolon>
Run Code Online (Sandbox Code Playgroud)
相反,我想这样:
<list>
<int>1</int>
<int>2</int>
<int>3</int>
</list>
Run Code Online (Sandbox Code Playgroud)
这类似于通用java集合的序列化方式.什么是最好的方法呢?
通过实现我自己的转换器,我已经完成了大部分工作,但是我坚持使用unmarshal方法,它不清楚如何实例化一个空列表...
class ListConverter( _mapper : Mapper ) extends AbstractCollectionConverter(_mapper) {
/** Helper method to use x.getClass
*
* See: http://scalide.blogspot.com/2009/06/getanyclass-tip.html
*/
def getAnyClass(x: Any) = x.asInstanceOf[AnyRef].getClass
def canConvert( clazz: Class[_]) = {
classOf[::[_]] == clazz
}
def marshal( value: Any, writer: HierarchicalStreamWriter, context: MarshallingContext) = {
val list = value.asInstanceOf[List[_]]
for ( item <- list ) {
writeItem(item, context, …Run Code Online (Sandbox Code Playgroud) 我正在使用xstream来处理xml字符串,但是对象的某些字段在版本之间发生了变化,因此我正在实现自定义转换器.下面列出了字段更改的摘要,只有前两种字段类型不同.
Field type1 type2
a short String
b String Object
c List List
d Object Object
.
.
.
x String String
Run Code Online (Sandbox Code Playgroud)
我的当前转换器被实现为专门处理每个字段,这导致unmarshal()方法中的大量"else if"条件
package a.b.c.reports;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
public class MyConverter implements Converter {
..
@Override
public Object unmarshal(HierarchicalStreamReader reader,UnmarshallingContext context) {
while (reader.hasMoreChildren()) {
reader.moveDown();
if(reader.getNodeName().equals("a"))
{
a = reader.getValue();
}
else if (reader.getNodeName().equals("b"))
{
b = (Object) context.convertAnother(reader, Object.class);
}
else if(reader.getNodeName().equals("c"))
{
a = reader.getValue();
}
..
..
} …Run Code Online (Sandbox Code Playgroud) 我想使用XStream将java哈希转换为json哈希.我觉得这应该比看起来容易.我正在寻找的是一种方法:
Map<String, String> map = new HashMap<String, String>();
map.put("first", "value1");
map.put("second", "value2");
Run Code Online (Sandbox Code Playgroud)
成为
{'first' : 'value1', 'second' : 'value2' }
Run Code Online (Sandbox Code Playgroud)
关闭我将它转换为一系列数组.
XStream xstream = new XStream(new JettisonMappedXmlDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
}
});
xstream.toXML(map);
Run Code Online (Sandbox Code Playgroud)
变成了
[["first", "value1"], ["second", "value2"]]
Run Code Online (Sandbox Code Playgroud)
我觉得将java哈希转换为json哈希应该是直截了当的.我错过了什么吗?
我有一个日期字段,当使用XStream转换为xml 时,以毫秒和区域给出时间.我只需将其转换或格式化为"MMMM dd, yyyy HH:mm:ss".如何使用XStream做到这一点?我不想改变吸气剂和制定者.谢谢.
我的课:
public class Datas {
private String name;
private Calendar dob;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Calendar getDob() {
return dob;
}
public void setDob(Calendar dob) {
this.dob = dob;
}
public static void main(String[] args) {
Datas datas = new Datas();
datas.setName("Ahamed");
datas.setDob(Calendar.getInstance());
XStream stream = new XStream();
System.out.println(stream.toXML(datas));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
<Datas>
<name>Ahamed</name>
<dob>
<time>1329081818801</time>
<timezone>Asia/Calcutta</timezone>
</dob> …Run Code Online (Sandbox Code Playgroud) 这是我尝试XStream的第一次.但是当我尝试解析我的xml文件时,我得到了这个异常:
Exception in thread "main" com.thoughtworks.xstream.mapper.CannotResolveClassException: root
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:79)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:45)
at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1157)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1141)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1012)
at com.mmm.transport.se.xmleditor.xml.TestXML.test(TestXML.java:20)
at com.mmm.transport.se.xmleditor.domain.Main.main(Main.java:13)
Run Code Online (Sandbox Code Playgroud)
所以我们可以看到错误发生在我的testXML类的第20行.它看起来像这样:
public class TestXML {
public void test() throws FileNotFoundException {
FileReader reader …Run Code Online (Sandbox Code Playgroud) 我不确定这是怎么回事,但我正在运行的程序给了我一个奇怪的错误.我在每个循环上得到一个ArrayIndexOutOfBoundsException:-1.整个错误如下:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at com.thoughtworks.xstream.core.util.OrderRetainingMap.entrySet(OrderRetainingMap.java:77)
at java.util.HashMap.putMapEntries(HashMap.java:511)
at java.util.HashMap.putAll(HashMap.java:784)
at com.thoughtworks.xstream.core.util.OrderRetainingMap.<init>(OrderRetainingMap.java:36)
at com.thoughtworks.xstream.converters.reflection.FieldDictionary.buildMap(FieldDictionary.java:135)
at com.thoughtworks.xstream.converters.reflection.FieldDictionary.fieldsFor(FieldDictionary.java:76)
at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.visitSerializableFields(PureJavaReflectionProvider.java:126)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doMarshal(AbstractReflectionConverter.java:81)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:72)
at com.thoughtworks.xstream.core.AbstractReferenceMarshaller.convert(AbstractReferenceMarshaller.java:69)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:43)
at com.thoughtworks.xstream.core.TreeMarshaller.start(TreeMarshaller.java:82)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.marshal(AbstractTreeMarshallingStrategy.java:37)
at com.thoughtworks.xstream.XStream.marshal(XStream.java:895)
at com.thoughtworks.xstream.XStream.marshal(XStream.java:884)
at com.thoughtworks.xstream.XStream.toXML(XStream.java:857)
at com.thoughtworks.xstream.XStream.toXML(XStream.java:844)
at unl.cse.assignments.DataConverter.output(DataConverter.java:210)
at unl.cse.assignments.DataConverter.main(DataConverter.java:121)
Run Code Online (Sandbox Code Playgroud)
第210行是pw.print行:
for(Product p : products)
{
if(AwardTicket.class.isInstance(p)){
xstream.alias("awardTicket", AwardTicket.class);
pw.print(xstream.toXML(p) + "\n");
}
}
Run Code Online (Sandbox Code Playgroud)
(第121行只调用输出)
我一直在调查这个错误很长一段时间,我无法弄清楚它的原因.我认为xstream有问题,但我尝试了其他输出.
我开始使用流口水,我想在spring-boot服务中使用它,但是即使对于一个简单的例子,我在Xstream上也没有这种方法错误。我错过了什么?
Caused by: java.lang.NoSuchMethodError: com.thoughtworks.xstream.XStream.setupDefaultSecurity(Lcom/thoughtworks/xstream/XStream;)V
at org.kie.internal.xstream.XStreamUtils.internalCreateXStream(XStreamUtils.java:58)
at org.kie.internal.xstream.XStreamUtils.createXStream(XStreamUtils.java:38)
at org.drools.compiler.kproject.models.KieModuleModelImpl$kModuleMarshaller.<init>(KieModuleModelImpl.java:170)
at org.drools.compiler.kproject.models.KieModuleModelImpl$kModuleMarshaller.<init>(KieModuleModelImpl.java:169)
at org.drools.compiler.kproject.models.KieModuleModelImpl.<clinit>(KieModuleModelImpl.java:167)
at org.drools.compiler.kie.builder.impl.ClasspathKieProject.fetchKModule(ClasspathKieProject.java:179)
at org.drools.compiler.kie.builder.impl.ClasspathKieProject.fetchKModule(ClasspathKieProject.java:141)
at org.drools.compiler.kie.builder.impl.ClasspathKieProject.discoverKieModules(ClasspathKieProject.java:112)
at org.drools.compiler.kie.builder.impl.ClasspathKieProject.init(ClasspathKieProject.java:84)
at org.drools.compiler.kie.builder.impl.KieContainerImpl.<init>(KieContainerImpl.java:142)
at org.drools.compiler.kie.builder.impl.KieServicesImpl.newKieClasspathContainer(KieServicesImpl.java:135)
at org.drools.compiler.kie.builder.impl.KieServicesImpl.getKieClasspathContainer(KieServicesImpl.java:101)
at org.drools.compiler.kie.builder.impl.KieServicesImpl.getKieClasspathContainer(KieServicesImpl.java:79)
Run Code Online (Sandbox Code Playgroud) 我有以下XML:
<patient>
<name>Mr. Sick</name>
<report>
<paragraph><bold>Conclusion</bold>text...</paragraph>
</report>
</patient>
Run Code Online (Sandbox Code Playgroud)
我想将此转换为类患者的实例,如下所示:
Class Patient {
String name = "Mr. Sick";
String report = "<paragraph><bold>Conclusion</bold>text...</paragraph>";
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用XStream仅转换部分XML并将报告字段保留为XML格式?怎么做到呢?
警告:发生了非法的反射访问操作警告:com.thoughtworks.xstream.core.util.Fields(文件:libraries / xstream-1.4.10.jar)对字段java.util.TreeMap.comparator的非法反射访问