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

如何使用jax-rs将bean结构映射到其他模式

西门嘉澍
2023-03-14
问题内容

我有这个bean

@XmlRootElement
class Test {
   boolean someValue;
   List<Field> fields;
}

我想序列化为

<fields>
   <field>
       <name>someValue</name>
       <value>...</value>
   </field>
</fields>
<fields>
   <field>
       <name>otherValue</name>
       <value>...</value>
   </field>
</fields>

(或作为json)

我应该如何做,最好使用jaxb注释?

我正在使用运动衫,但答案不必特定于它。


问题答案:

接下来呢?

使用EclipseLink JAXB(MOXy),您可以执行以下操作。注意:我是MOXy技术负责人。

测试

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlType(propOrder={"someValue", "fields"})
@XmlAccessorType(XmlAccessType.FIELD)
class Test {

    @XmlJavaTypeAdapter(SomeValueAdapter.class)
    @XmlPath("fields[1]")
    boolean someValue;

    @XmlJavaTypeAdapter(FieldsAdapter.class)
    List<Field> fields = new ArrayList<Field>();

    public Boolean isSomeValue() {
        return someValue;
    }

    public void setSomeValue(boolean someValue) {
        this.someValue = someValue;
    }

    public List<Field> getFields() {
        return fields;
    }

    public void setFields(List<Field> fields) {
        this.fields = fields;
    }

    public void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
        for(Field field : fields) {
            if("someValue".equals(field.getName())) {
                someValue = Boolean.valueOf(field.getValue());
                fields.remove(field);
            }
        }
    }

}

领域

public class Field {

    private String name;
    private String value;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

SomeValueAdapter

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class SomeValueAdapter extends XmlAdapter<AdaptedField, Boolean> {

    @Override
    public Boolean unmarshal(AdaptedField v) throws Exception {
        String value = v.getField().getValue();
        return Boolean.valueOf(value);
    }

    @Override
    public AdaptedField marshal(Boolean v) throws Exception {
        AdaptedField adaptedField = new AdaptedField();
        Field field = new Field();
        field.setName("someValue");
        field.setValue(String.valueOf(v));
        adaptedField.setField(field);
        return adaptedField;
    }

}

字段适配器

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class FieldsAdapter extends XmlAdapter<AdaptedField, Field> {

    @Override
    public Field unmarshal(AdaptedField v) throws Exception {
        return v.getField();
    }

    @Override
    public AdaptedField marshal(Field v) throws Exception {
        AdaptedField adaptedField = new AdaptedField();
        adaptedField.setField(v);
        return adaptedField;
    }

}

AdaptedField

public class AdaptedField {

    private Field field;

    public Field getField() {
        return field;
    }

    public void setField(Field field) {
        this.field = field;
    }

}

演示版

导入java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Test.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Test test = (Test) unmarshaller.unmarshal(new File("input.xml"));

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(test, System.out);
    }

}

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<test>
   <fields>
      <field>
         <name>someValue</name>
         <value>true</value>
      </field>
   </fields>
   <fields>
      <field>
         <name>otherValue</name>
         <value>1</value>
      </field>
   </fields>
   <fields>
      <field>
         <name>anotherValue</name>
         <value>2</value>
      </field>
   </fields>
</test>


 类似资料:
  • 问题内容: 我已经读过我可以创建一个实现,将抛出的应用程序异常映射到对象。 我创建了一个简单的示例,如果在保留对象时电话长度大于20个字符,则会引发异常。我期望将异常映射到HTTP 400(错误请求)响应;但是,我收到HTTP 500(内部服务器错误),但有以下异常: 我想念什么?任何意见是极大的赞赏。 异常映射器: 异常类: 实体类: 服务: 问题答案: InvalidDataException

  • 我正在尝试将从远程服务获得的响应映射到对象中。对于客户端,我使用的是 JAX-RS 注释接口: 响应采用以下格式,作为对象的JSON列表: 我试图映射到的类是: 它总是返回一个带有空项目列表的项目实例。有什么想法吗? 更新 将其更改为: 返回

  • ...但我得到: 我不知道如何应用这些信息。首先,我认为我需要为列表声明一些额外的映射(在同一个映射器类中),所以MapStruct知道如何像这样映射列表类型的每个字段: ...但我收到错误消息

  • 我需要将带有多个可选参数的路径映射到我的endpoint

  • 我试图在我们现有的JAX-RS REST项目中设置Swagger来记录我们的API。 对于接收JSON请求体的操作,我们一直使用以下习惯用法: 通过获取映射,JAX-RS将JSON对象映射到映射中,以按键名访问值。这样做很好,避免了每次这样的操作都需要一个模型。 但是,Swagger会扫描这些操作,并自动将Map作为请求参数。我的意图是,我在@ApiInverityParams注释中正确定义参数。

  • 我正在编写一个Java EE REST应用程序(它在Glassfish 4.1下运行),但在读取一个简单的键值JSON列表时遇到了问题。我试图使用POJO类生成和消费JSON,生成工作很好,但消费不起作用。让我们来看看密码。我用于生产和消费JSON POJO类如下所示: REST资源导入了这些库(我在这里提供了相关的库): 生成JSON的方法工作良好,如下所示: 因此我正确地获得了以下输出: 使用