如何编组Map< String,List< Objects>>使用JAXB [英] How to marshall Map<String, List<Objects>> using JAXB

查看:54
本文介绍了如何编组Map< String,List< Objects>>使用JAXB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码中遇到了一个问题。

I am facing an issue in my code.

     @XmlRootElement
        @XmlAccessorType(XmlAccessType.FIELD) 
        @Entity 
        @NamedQueries({
        @NamedQuery(name = Parameter.FIND_ALL, query = "SELECT pm FROM Parameter pm")
    })
    public class Parameter implements Serializable {

        public static final String FIND_ALL = "Parameter.findAll";

            @XmlTransient
            private static final long serialVersionUID = 1L;
            @Id @GeneratedValue 
            private Long id;
            @XmlAttribute
            private String type;

            private String name; 

           //Setters and Getters
    }


     @XmlRootElement 
    @XmlAccessorType(XmlAccessType.FIELD)
    public class ParameterMap {
        private Map<String, List<Parameter>> parameterMap = new HashMap<String, List<Parameter>>();

        @XmlElement
        public Map<String, List<Parameter>> getParameterMap() {
            return parameterMap;
        }

        public void setParmeterMap(Map<String, List<Parameter>> parameterMap) {
            this.parameterMap = parameterMap;
        }

    }


    @Path("/parameter")
    public class ParameterRESTResource {

        @Inject
        private ParameterService paramService;

        /**
         *
         * @return
       @GET
        @Path("/")
        @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
        public List<Parameter> getAllParameters() throws JAXBException { 

           ParameterMap parameterMap = formatParameters(paramService.getAllParameters());

            JAXBContext jaxbContext = JAXBContext.newInstance(ParameterMap.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            jaxbMarshaller.marshal(parameterMap, System.out);
            jaxbMarshaller.marshal(parameterMap, new File("c:/temp/employees.xml"));

            return paramService.getAllParameters();
        }

         public ParameterMap formatParameters(List<Parameter> parameters)
        {
            HashMap<String, List<Parameter>> parameterMap = new HashMap<String, List<Parameter>>();
            ParameterMap paramMap = new ParameterMap();
            Parameter param = null;

            List<Parameter> list = null;

            for(int i=0;i<parameters.size();i++)
            {
                param = new Parameter();

                param = parameters.get(i);

                if(param.getType()!="text")
                {
                    list = new ArrayList<Parameter>();

                    if(parameterMap.containsKey(param.getName()))
                    {
                        list = parameterMap.get(param.getName());
                        list.add(param);
                    }
                    else {
                        list = new ArrayList<Parameter>();
                        list.add(param);
                    }

                }else {
                    list = new ArrayList<Parameter>();
                    list.add(param);

                }

                parameterMap.put(param.getName(), list);

            }

            paramMap.setParmeterMap(parameterMap);
            return paramMap;
        }

当我在本地运行应用程序时( http:// localhost:8080 / home / rest / parameter / )我收到以下错误。我的主要要求是使用包含所有信息的xml在UI上显示Map>。

When I am running the application on my local(http://localhost:8080/home/rest/parameter/) I am getting the below error. My main requirement is to show the Map> on the UI with the xml with all the information.


org.jboss.resteasy.spi。 UnhandledException:
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:$ count
IllegalAnnotationExceptions java.util.List是一个接口,JAXB
无法处理接口。此问题与以下
位置有关:私有java.util.Map的java.util.List $
nl.paston.insrame.model.ParameterMap.parameterMap at
nl。 paston.insurance.product.model.ParameterMap
org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:76)
org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java) :212)
org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:149)
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:372)
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)
org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
org .jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
org.jboss.resteasy.plugins.s erver.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
io.undertow.servlet.handlers.ServletHandler.handleRequest( ServletHandler.java:86)
io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java: 36)
org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
io.undertow.servlet。 handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
io.undertow.servlet.handlers.security。 CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72)
io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler。 java:76)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
org.wildfly.extension.und ertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.server.handlers。 PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282)
io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler。 java:261)
io.undertow.servlet.handlers.ServletInitialHandler.access $ 000(ServletInitialHandler.java:80)
io.undertow.servlet.handlers.ServletInitialHandler $ 1.handleRequest(ServletInitialHandler.java:172)
io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
io.undertow.server.HttpServerExchange $ 1.run(HttpServerExchange.java:774)
java.util.concurrent .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurren t.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)

org.jboss.resteasy.spi.UnhandledException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions java.util.List is an interface, and JAXB can't handle interfaces. this problem is related to the following location: at java.util.List at private java.util.Map nl.paston.insurance.product.model.ParameterMap.parameterMap at nl.paston.insurance.product.model.ParameterMap org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:76) org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:212) org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:149) org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:372) org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) javax.servlet.http.HttpServlet.service(HttpServlet.java:790) io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86) io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72) io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50) io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282) io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261) io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80) io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172) io.undertow.server.Connectors.executeRootHandler(Connectors.java:199) io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) java.lang.Thread.run(Thread.java:745)

我希望我已经提供了所需的所有信息。在这个专家组中,请大家在这个问题上请帮助我。任何小的帮助对我都是最有帮助的。感谢您的帮助。

I hope I have provided with all the information required. In this expert group of people, request you all to please help me in this issue. Any small help would be of greatest help to me. Thanks for your help in advance.

推荐答案

包含集合作为值的地图有点棘手;你需要一个适配器和类来表示JAXB可以处理的映射条目。

Maps containing collections as values are a bit tricky; you need an adapter and classes for representing the map entries in a way JAXB can handle.


@XmlAccessorType(XmlAccessType.FIELD) 
public class ListOfEntry {
    @XmlElement
    private List list = new ArrayList();
    public List getList(){ return list; }
}

@XmlAccessorType(XmlAccessType.FIELD) 
public class Entry {
    @XmlElement
    private String key;
    @XmlElement
    private List list = new ArrayList();
    public String getKey(){ return key; }
    public void setKey( String value ){ key = value; }
    public List getList(){ return list; }
}

适配器来回转换:


public class Adapter 
extends XmlAdapter>> {
    @Override
    public Map> unmarshal(ListOfEntry loe)
        throws Exception {
        Map> map = new HashMap();
        for(Entry entry : loe.getList() ) {
            map.put(entry.getKey(), entry.getList() );
        }
        return map;
    }

    @Override
    public ListOfEntry marshal(Map> map)
        throws Exception {
        ListOfEntry loe = new ListOfEntry();
        for(Map.Entry> mapEntry : map.entrySet()) {
            Entry entry = new Entry();
            entry.setKey( mapEntry.getKey() );
            entry.getList().addAll( mapEntry.getValue() );
            loe.getList().add(entry);
        }
        return loe;
    }
}

您必须在地图字段中添加注释:

And you must add an annotation to the Map field:

@XmlElement
@XmlJavaTypeAdapter(Adapter.class)
private Map<String, List<Parameter>> parameterMap = new HashMap<>();

这篇关于如何编组Map&lt; String,List&lt; Objects&gt;&gt;使用JAXB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆