Java 自定义解组(在Jersey中)请求正文中的字段到HashMap中?

Java 自定义解组(在Jersey中)请求正文中的字段到HashMap中?,java,web-services,jersey,unmarshalling,Java,Web Services,Jersey,Unmarshalling,我有一个Jersey 1.18.1服务器,当前希望有人在POST请求中: <person> <name>sdfsdfd</name> <age>24</age> ... </person> 我知道我必须编写一个自定义反序列化程序,比如@XmlJavaTypeAdapterPersonOptionsAdapter.class。我在网上找到的关于适配器的内容是,当整个请求体需要自定义解组时,使用一个适配

我有一个Jersey 1.18.1服务器,当前希望有人在POST请求中:

<person>
    <name>sdfsdfd</name>
    <age>24</age>
    ...
</person>
我知道我必须编写一个自定义反序列化程序,比如@XmlJavaTypeAdapterPersonOptionsAdapter.class。我在网上找到的关于适配器的内容是,当整个请求体需要自定义解组时,使用一个适配器。然而,对于某个特定的成员来说,这似乎并不适用于我。我试着用PersonOptions Adapter注释options成员,还有一些类似的东西

请分享您关于如何在请求对象的特定成员上应用自定义适配器的想法和/或解决方案?

我找到了一种方法

这是JAXB适配器,需要

<!-- language: java -->
@XmlRootElement
public class JaxbXml2MapAdapter extends XmlAdapter<Object, HashMap<String, String>> {

    public JaxbXml2MapAdapter() {
        super();
    }

    @Override
    public Object marshal(HashMap<String, String> map) throws Exception {
        // I wasn't using it for sending this out in the response. So
        // did not bother to implement marshaling.
        return null;
    }

    @Override
    public HashMap<String, String> unmarshal(Object rawRoot) throws Exception {
        final HashMap<String, String> map = new HashMap<String, String>();

        if (rawRoot == null || !(rawRoot instanceof Element)) {
            return map;
        }

        final Element  root     = (Element) rawRoot;
        final NodeList children = root.getChildNodes();

        if (children.getLength() == 0) {
            return map;
        }

        // TODO: Analyze if there is a better way of reading the nodes.
        // Currently we get null/empty node names, white space values etc.

        for (int index = 0; index < children.getLength(); ++index) {
            final Node   child = children.item(index);
            final String name  = child.getLocalName();

            if (name == null || name.length == 0) {
               continue;
            }

            final String value = child.getTextContent();
            map.put(name, value);
        }

        return map;
    }
}
以下是如何使用适配器:

<!-- language: java -->
@XmlRootElement(name = "myRequest")
public class MyRequest {

    @XmlElement(required = true)
    private String token;

    private List<int> flags = new ArrayList<int>();

    @XmlJavaTypeAdapter(value = JaxbXml2MapAdapter.class)
    private HashMap<String, String> options = new HashMap<String, String>();

    public MyRequest() {
    }

    // .... blah blah blah
}
下面是一个示例,请求主体是一个可选参数:


希望这对观看的人有所帮助
<!-- language: java -->
@XmlRootElement(name = "myRequest")
public class MyRequest {

    @XmlElement(required = true)
    private String token;

    private List<int> flags = new ArrayList<int>();

    @XmlJavaTypeAdapter(value = JaxbXml2MapAdapter.class)
    private HashMap<String, String> options = new HashMap<String, String>();

    public MyRequest() {
    }

    // .... blah blah blah
}
<!-- language: xml -->
<myRequest>
   <token>QWe35234</token>
   <flags>1</flags>
   <flags>4</flags>
   <options>
       <name>Johnny</name>
       <points>25.3</options>
       <someRandomStuff>sdfsgsagasfgasgsaf</someRandomStuff>
   </options>
</myRequest>