Java 获取com.thoughtworks.xstream.converters.ConversionException将xml列表转换为DTO
尝试将XML有效负载分配给java对象时,我收到一个ConversionException。我所要做的就是将名称列表放入作为DTO一部分的list对象中。有人能帮我解决这个问题吗?我已经看过其他一些帖子,但还没有得到一个解决方案。以下是我的代码: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 { //
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;