[英]XStream - com.thoughtworks.xstream.converters.ConversionException
[英]Getting com.thoughtworks.xstream.converters.ConversionException converting xml list to DTO
嘗試將XML有效負載分配給java對象時,我收到了ConversionException。 我要做的就是將名稱列表放入DTO的List對象中。 有人可以幫我解決這個問題嗎? 我看了其他一些帖子,但還沒有解決。 這是我有的代碼:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
try (PrintWriter pw = response.getWriter())
{
InputDTO inputDTO = Reader.inputFromXML(request);
pw.println("test");
}
}
讀者班
public class Reader {
private static final XStream xstream = new XStream(new DomDriver("UTF-8")) {
{
//this.processAnnotations(InputDTO.class);
}
};
public static InputDTO inputFromXML(HttpServletRequest request) throws IOException {
InputDTO input = null;
try (InputStream is = request.getInputStream())
{
xstream.alias("request", InputDTO.class);
input = (InputDTO) xstream.fromXML(is);
}
return input;
}
}
InputDTO:
public class InputDTO {
@XStreamImplicit(itemFieldName = "names")
private List<String> names;
public List<String> getNames() {
return names;
}
public void setNames(List<String> names) {
this.names = names;
}
}
這是我發送的請求:
<request>
<names>
<name>Craig</name>
<name>John</name>
</names>
</request>
這是完整的堆棧跟蹤。
SEVERE: Servlet.service() for servlet ListOfNames threw exception
com.thoughtworks.xstream.converters.ConversionException: name : name : name : name
---- Debugging information ----
message : name : name
cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message : name : name
class : com.hd.testing.InputDTO
required-type : java.util.ArrayList
path : /request/names/name
-------------------------------
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:861)
at com.hd.testing.Reader.inputFromXML(Reader.java:26)
at com.hd.testing.ListOfNames.doPost(ListOfNames.java:40)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
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:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at com.hd.ta.aa.dao.catalina.THDDAOValve.invoke(Unknown Source)
at com.hd.ta.aa.catalina.realm.THDSingleSignOn.invoke(THDSingleSignOn.java:631)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:724)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: name : name
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:68)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:71)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:86)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:96)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:52)
at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:70)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:68)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:61)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
... 32 more
首先,這與Servlet無關。
使用@XStreamImplicit(itemFieldName = "names")
將打印出來(如果將InputDTO
的別名設置為"request"
)
<request>
<names>Craig</names>
<names>John</names>
</request>
但是,如果要將名稱包裝到元素中,可以使用NamedCollectionsConverter
:
final NamedCollectionConverter namesConverter = new NamedCollectionConverter(
xstream.getMapper(), "name", String.class);
xstream.registerLocalConverter(InputDTO.class, "names", namesConverter);
這是完整的示例:
public class DTOTest {
public static void main(String[] args) {
final XStream xstream = new XStream();
xstream.processAnnotations(InputDTO.class);
final NamedCollectionConverter namesConverter = new NamedCollectionConverter(
xstream.getMapper(), "name", String.class);
xstream.registerLocalConverter(InputDTO.class, "names", namesConverter);
final InputDTO inputDTO = new InputDTO();
final List<String> names = new ArrayList<String>();
names.add("Craig");
names.add("John");
// inputDTO.setNames(Arrays.asList("Craig", "John")); doesn't work!
inputDTO.setNames(names);
final String xml = xstream.toXML(inputDTO);
System.out.println(xml);
System.out.println();
final InputDTO inputDTO2 = (InputDTO) xstream.fromXML(xml);
for (String name : inputDTO2.getNames()) {
System.out.println(name);
}
}
}
@XStreamAlias("request")
class InputDTO {
private List<String> names;
public List<String> getNames() {
return names;
}
public void setNames(List<String> names) {
this.names = names;
}
}
它輸出:
<request>
<names>
<name>Craig</name>
<name>John</name>
</names>
</request>
Craig
John
我不知道如何使用注釋而不是registerConverter(...)
設置此轉換器
@XStreamConverter(value = NamedCollectionConverter.class, types = { String.class }, strings = { "name" })
private List<String> names;
無法轉換ArrayLists
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.