0

REST サービスが XML リクエストを受け取り、リクエスト内のデータをデータベースに保存する必要があるという状況に直面しています。要求 XML は基本的に、永続化する必要があるクラスの値を提供します。

たとえば、次のようにクラスを永続化する必要があるとします。

@Entity
public class Person {
    @Id @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
}

リクエスト XML は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<PersonInputs>
    <Input type="String" name="firstName">Foo</Input>
    <Input type="String" name="lastName">Bar</Input>
</PersonInputs>

JAXB アノテーションを使用してPersonオブジェクトを作成し、リクエスト XML から簡単な方法でデータをバインドすることはできますか? 私は今のところ JAXB に慣れていないので、情報に基づいた提案が得られることを願っています。それにもかかわらず、どんな意見も大歓迎です。

4

1 に答える 1

1

このソリューションを追加のクラスで使用できますInput

@XmlAccessorType(XmlAccessType.FIELD)
public class Input 
{
   @XmlAttribute
   private String type;
   @XmlAttribute
   private String name;
   @XmlValue
   private String value;

   public Input() {}

   public Input(String type, String name, String value) 
   {
      this.type = type;
      this.name = name;
      this.value = value;
   }
} 

およびエンティティ
バリアント 1の追加のゲッター

@XmlRootElement(name= "PersonInputs")
@XmlAccessorType(XmlAccessType.NONE)
public class Person
{
    @Id @GeneratedValue
    private Long id; 

    private String firstName = "foo";

    private String lastName = "bar";

    // getters/setters

    @XmlElement(name= "Input")
    Input getFirstNameXML()
    {
       return new Input(String.class.getSimpleName(), "firstName", firstName);
    }

    @XmlElement(name= "Input")
    Input getLastNameXML()
    {
       return new Input(String.class.getSimpleName(), "lastName", lastName);
    }
}  

バリアント 2

@XmlRootElement(name= "PersonInputs")
@XmlAccessorType(XmlAccessType.NONE)
public class Person
{
    private Long id; 

    private String firstName = "foo";

    private String lastName = "bar";

    // getters/setters

    @XmlElement(name = "Input")
    List<Input> getList() throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException
    {
       return getInputs(this, "firstName", "lastName"); // fields names
    }
}  

利用方法getInputs

static List<Input> getInputs(Object thisObj, String ... fields) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException
{
   final List<Input> retVal = new ArrayList<Input>();
   for (String field : fields)
   {
      Field f = thisObj.getClass().getDeclaredField(field);
      f.setAccessible(true);
      retVal.add(new Input(f.getType().getSimpleName(), field, (String )f.get(thisObj)));
   }
   return retVal;   
}
于 2013-11-10T20:07:40.527 に答える