简体   繁体   English

获取com.thoughtworks.xstream.converters.ConversionException将xml列表转换为DTO

[英]Getting com.thoughtworks.xstream.converters.ConversionException converting xml list to DTO

I am receiving a ConversionException when trying assign the XML payload to a java object. 尝试将XML有效负载分配给java对象时,我收到了ConversionException。 All I am trying to do is get a list of names into a List object that is part of the DTO. 我要做的就是将名称列表放入DTO的List对象中。 Could someone please help me with solving this issue? 有人可以帮我解决这个问题吗? I have looked at some other posts but havent been able to get a resolution. 我看了其他一些帖子,但还没有解决。 Here is code i have: 这是我有的代码:

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");

    }
}

Reader Class 读者班

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: 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;
}

}

here is the request i am sending: 这是我发送的请求:

<request>
    <names>
        <name>Craig</name>
        <name>John</name>
    </names>
</request>

Here is the full stack trace. 这是完整的堆栈跟踪。

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

At first, this has nothing to do with Servlets. 首先,这与Servlet无关。

Your code with @XStreamImplicit(itemFieldName = "names") will print out (if you set the alias for InputDTO to "request" ) 使用@XStreamImplicit(itemFieldName = "names")将打印出来(如果将InputDTO的别名设置为"request"

<request>
  <names>Craig</names>
  <names>John</names>
</request>

But if you want to wrap the names into an element, you can use a NamedCollectionsConverter : 但是,如果要将名称包装到元素中,可以使用NamedCollectionsConverter

final NamedCollectionConverter namesConverter = new NamedCollectionConverter(
            xstream.getMapper(), "name", String.class);
    xstream.registerLocalConverter(InputDTO.class, "names", namesConverter);

Here is fully working example: 这是完整的示例:

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;
    }
}

It prints out: 它输出:

<request>
  <names>
    <name>Craig</name>
    <name>John</name>
  </names>
</request>

Craig
John

I don't know how to set this converter with an annotation instead of registerConverter(...) 我不知道如何使用注释而不是registerConverter(...)设置此转换器

@XStreamConverter(value = NamedCollectionConverter.class, types = { String.class }, strings = { "name" })
private List<String> names;

Cannot convert ArrayLists . 无法转换ArrayLists

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 XStream-com.thoughtworks.xstream.converters.ConversionException - XStream - com.thoughtworks.xstream.converters.ConversionException com.thoughtworks.xstream.converters.ConversionException - com.thoughtworks.xstream.converters.ConversionException 转换错误 com.thoughtworks.xstream.converters.ConversionException - Conversion error com.thoughtworks.xstream.converters.ConversionException Spring 批处理 JobOperator com.thoughtworks.xstream.converters.ConversionException:无法构造类型 - Spring batch JobOperator com.thoughtworks.xstream.converters.ConversionException: Cannot construct type com.thoughtworks.xstream.converters.ConversionException 使用 maven eclipse 运行 jmeter 脚本时 - com.thoughtworks.xstream.converters.ConversionException while running jmeter script using maven eclipse Axon 抱怨 com.thoughtworks.xstream.converters.ConversionException:调用方法失败 - Axon complaining on com.thoughtworks.xstream.converters.ConversionException: Failed calling method Getting com.thoughtworks.xstream.mapper.CannotResolveClassException while converting JSON to CSV using Apache Camel 2.25.0 - Getting com.thoughtworks.xstream.mapper.CannotResolveClassException while converting JSON to CSV using Apache Camel 2.25.0 尝试使用XStream解组时获取com.thoughtworks.xstream.mapper.CannotResolveClassException - Getting com.thoughtworks.xstream.mapper.CannotResolveClassException while trying to unmarshal using XStream com.thoughtworks.xstream.mapper.CannotResolveClassException - com.thoughtworks.xstream.mapper.CannotResolveClassException com.thoughtworks.xstream.mapper.CannotResolveClassException - com.thoughtworks.xstream.mapper.CannotResolveClassException
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM