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

Java 获取com.thoughtworks.xstream.converters.ConversionException将xml列表转换为DTO,java,xml,dto,xstream,Java,Xml,Dto,Xstream,尝试将XML有效负载分配给java对象时,我收到一个ConversionException。我所要做的就是将名称列表放入作为DTO一部分的list对象中。有人能帮我解决这个问题吗?我已经看过其他一些帖子,但还没有得到一个解决方案。以下是我的代码: protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //

尝试将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;
}
}
输入到:

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

}

首先,这与servlet无关

带有
@XStreamImplicit(itemFieldName=“names”)
的代码将被打印出来(如果您将
InputDTO
的别名设置为
“请求”

下面是一个完整的工作示例:

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

首先无法转换
数组列表

,这与servlet无关

带有
@XStreamImplicit(itemFieldName=“names”)
的代码将被打印出来(如果您将
InputDTO
的别名设置为
“请求”

下面是一个完整的工作示例:

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>Craig</names>
  <names>John</names>
</request>
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
@XStreamConverter(value = NamedCollectionConverter.class, types = { String.class }, strings = { "name" })
private List<String> names;