2011-05-04 41 views
1

我有这个bean如何将绿豆结构映射到一个不同的模式与JAX-RS

@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注释?

我使用球衣,但答案doens't必须是特定于它。

+1

字段列表中有哪些类型的对象? – 2011-05-04 09:22:33

+0

有用的评论,我刚刚编辑的问题更接近我的现实世界的用法。 – ymajoros 2011-05-04 09:34:07

+0

我的现实世界的例子在这个问题中更好地解释:http://stackoverflow.com/questions/5820028/how-to-use-some-indirection-when-unmarshalling-json-to-java-bean-using-jersey- usi – ymajoros 2011-05-04 09:39:45

回答

1

以下情况如何?

使用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; 
    } 

} 

FieldsAdapter

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> 

更多信息

+0

很高兴知道这可以做到这一点。我真的很想有没有相关性(如我的真正的问题是写一个吉拉休息客户用更少的/没有依赖关系)。没有标准的做法吗?另外,这将与json一起工作吗? – ymajoros 2011-05-04 13:35:33

+0

@ymajoros - 您可以利用抛弃任何JAXB实现生产/消费JSON(http://bdoughan.blogspot.com/2011/04/jaxb-and-json-via-jettison.html),泽西岛为自动执行此操作你在服务器端。只需使用你可能需要建立一个中间模型,并从它转换成/直JAXNB的API。 – 2011-05-04 13:43:14

+0

我已经在使用它了。事实上,我使用了XML在这个问题上要尽量问不同的看法,因为我原来的问题似乎并不具备有用的答案。但我真的在使用json。我可以使用MOXY与JSON(我猜不是)?我可以使用莫西只为某些使用,无需更换它JAXB我的应用程序的其他部分? – ymajoros 2011-05-05 10:48:21

相关问题