我有这个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的方法工作良好,如下所示: 因此我正确地获得了以下输出: 使用