当前位置: 首页 > 知识库问答 >
问题:

如何使用JAXB marshall映射

饶志
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;
    }
}

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

共有1个答案

闽承望
2023-03-14

包含集合作为值的映射有点棘手;您需要一个适配器和类来以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( mapEntry.getKey() );
            entry.getList().addAll( mapEntry.getValue() );
            loe.getList().add(entry);
        }
        return loe;
    }
}

并且必须向Map字段添加注释:

@XmlElement
@XmlJavaTypeAdapter(Adapter.class)
private Map<String, List<Parameter>> parameterMap = new HashMap<>();
 类似资料:
  • 问题内容: 我正在尝试为Rails 4.1应用程序清理一些样式。我不想列出每种颜色及其变化,而是想创建颜色/值的映射,然后通过对其进行迭代来生成CSS。 但是,我从中得到以下错误: 我可以使用Sass变量和mixins很好;为什么也不能使用SASS映射? 问题答案: 正如@dinocarl所指出的那样,SASS 的和功能在版本3+中。我必须将gem 升级到版本5+,因为该版本的gem包SASS 3

  • 我想将我的应用程序迁移到Spring Boot Jar部署。它目前使用没有启动的Spring4。 我在上有一个REST-API侦听器,在上有一个JavaScript-fronten,可以在上访问。 现在我找不到在靴子里做同样的事情的方法。 通过更改属性,我设法在处获得了api监听,但是我没有在处注册第二个servlet来为我的js-frontend服务。我知道jar部署不支持,我还知道Spring

  • 我正在使用下面的代码片段映射对象 它没有映射,但当我添加这个时,它工作得很好 但却无法理解它的功能<代码>导入={Instant.class,DateTimeFormatter.class}它如何帮助映射对象?

  • 我已经讨论过这个问题:如何使用Mockito在Spring中模拟自动构建的@Value字段?。我们如何模拟以下内容? 这样我们就可以在进行模拟时获取其价值?

  • 我正在尝试使用ModelMapper映射对象树。 我创建了一个例子来说明我的问题: 类包含多个属性 类包含类型为Sub的对象和(至少)另一个属性 类目标包含一个简单的属性列表 源属性和目标属性的类型不同 代码: 我正在寻找一种配置单个ModelMapper实例的方法,以便满足以下约束: modelMapper能够将Sub类型的对象转换为目标对象 不幸的是,行<代码>映射(source.sub,de

  • 我们使用的是Spring Boot2。 我们想使用Spring Boot的刷新机制,但是由于一个bug我们不能使用,因此我们不得不用和替换所有这些。 所以我们用了: 例如,使用该YAML文件: null 但是我们不能使用其他类型的属性绑定,因为我们正在将这个应用程序部署到kubernetes中,并使用kubernetes的配置映射。 所以我们想知道,是否还有其他机会让与一起工作