2015-10-17 42 views
1

我在我的代码中遇到了一个问题。如何使用JAXB编码映射<String,List <Objects>>

 @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/)时,出现以下错误。我的主要要求是在UI上用包含所有信息的xml显示Map>。

org.jboss.resteasy.spi.UnhandledException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: IllegalAnnotationExceptions java.util.List中的1个计数是一个接口,和JAXB 罐”处理接口。此问题与以下相关 位置:位于private java.util.Map上的java.util.List 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.ServletContainerDis patcher.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(AuthenticationMechanismsHandl er.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)

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

回答

1

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


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

并且必须添加注释到地图领域:

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

三江源洙多。我有不同的要求,但你的代码给了我一个关于如何访问它的想法 –

相关问题