当前位置: 首页 > 面试题库 >

如何编组地图>使用JAXB

明利
2023-03-14
问题内容

我在代码中遇到问题。

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

    @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
/
)上运行应用程序时,出现以下错误。我的主要要求是Map<String,List<Parameters>>在xml上的UI上显示所有信息。

org.jboss.resteasy.spi.UnhandledException:com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:IllegalAnnotationExceptions的1个计数java.util.List是一个接口,JAXB无法处理接口。此问题与以下位置有关:在java.util.List处在私有java.util.Map处nl.paston.insurance.product.model.ParameterMap.parameterMap在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。

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


问题答案:

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

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

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

适配器来回进行转换:

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

    @Override
    public ListOfEntry marshal(Map<String, List<Parameter>> map)
        throws Exception {
        ListOfEntry loe = new ListOfEntry();
        for(Map.Entry<String, List<Parameter>> mapEntry : map.entrySet()) {
            Entry entry = new Entry();
            entry.setKey( html" target="_blank">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<>();


 类似资料:
  • 问题内容: 我正在尝试从Google Map geocode api获取LatLng。我的代码下方的地址值为“ New York,NY” 但我没有得到任何警报值。 谢谢你的帮助。 问题答案: 您需要就规则与API联系。 编辑: 我真是愚蠢,早上不应该在stackoverflow上!问题是跨域请求。出于安全原因,这是不允许的。 请使用Google自己的地址解析客户端。

  • 问题内容: 我想使用GSON将下面的Example类序列化为JSON。 我期望得到以下输出: 但是调用函数返回 看来GSON无法在Map 内序列化Map 。这是GSON的限制,还是我在这里做错了? 问题答案: Nishant的答案之所以起作用,是因为Gson的默认构造函数默认启用所有类型的东西,否则您将不得不使用GsonBuilder手动启用它们。 从JavaDocs: 使用默认配置构造一个Gso

  • 本文向大家介绍百度地图api如何使用,包括了百度地图api如何使用的使用技巧和注意事项,需要的朋友参考一下 如果想用百度地图api,首先需要先获取一个百度地图api的密钥,然后引入百度地图的api,接下来,我们详细介绍下获取、引入api密钥的技巧,以及通过代码给大家详解下百度地图api如何使用,具体请看下文。 首先 ,如果想调用百度地图api,你需要获取一个百度地图api的密钥。 申请密钥很简单,

  • 问题内容: 我可以使用泛型声明地图数组以指定地图类型: 但是,我不知道如何正确实例化它: 如何在不出现编译器错误或警告的情况下实例化此映射数组? 更新: 谢谢大家的回复。我最终接受了List建议。 问题答案: 您不能安全地创建通用数组。有效的Java 2nd Edition在“ 泛型 ” 一章中进行了详细介绍。从第119页的最后一段开始: 为什么创建通用数组是非法的?因为它不是类型安全的。如果合法

  • 我有这个代码,它是用for循环实现的。我想用一个字母来写。流和。map()函数。我试着用这个。map()函数。但不幸的是,我得到了以下错误: 不兼容的类型。必填列表 这里是旧代码: 这是我使用。地图() 有没有关于我如何解决这个问题的建议?或者我应该注意什么?

  • 我正在尝试为java应用程序制作一个表单。它包含一个带有用户列表的组合框。假设我有一个类教授,有3个属性。Id是“唯一的”,这是数据库所必需的。 我认为最用户友好的选项是在组合框中填写“教授”类的姓氏和名字,这就是我所做的。但是现在我不知道如何取回教授对象。 就像我说的,我用姓氏、空格和名字填充了组合框,但是一旦用户选择了教授,我不知道如何选择用户选择的教授。 有什么方法可以在Combobox中放