8

リクエストがUIからサービスクラスに送信されるアンマーシャリングプロセスにJAXBを使用しています。以下は、XMLリクエストの形式です。

<SampleRequest  user="testUser"  account="testAccount"    Specifier=  "value1a,value1b,value1c : name2a,value2b,value2c"/>

私の要件は、Specifier属性が複数の一連の値(:コロンで区切られている)を持っていることです。各一連の値をカスタムJavaクラスにマップする必要があります

私はこのように試しました

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SampleRequest {

    @XmlAttribute
    private String user;

    @XmlAttribute
    private String account;


    @XmlAttribute(name="Specifier")
    private List<Specifier> specifier;


}

Specifier.java

@XmlJavaTypeAdapter(SpecifierAdapter.class)
public class Specifier {



}

SpecifierAdapter.java

public class SpecifierAdapter  extends XmlAdapter{

    @Override
    public Object marshal(Object arg0) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object unmarshal(Object arg0) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }

}

編集部分

クラスSpecifierには3つのStringプロパティがあります。

class Specifier
{
String value1;
String value2;
String value3;
}

たとえば、各シリーズの指定子が必要です(value1a、value1b、value1c)は、それぞれvalue1、value2、value3にマップする必要があります

編集パート3

こんにちは、 応答をありがとう、私はこの例をアンマーシャリングしようとしました、私が見つけたのはそれです、私はnullを取得しています

これは私が渡したリクエストです

<sampleRequest user="user" account="account" Specifier="v1,v2,v3 : a1,a2,a3"/>

私のSpecifierクラスが正しいかどうかを確認したいだけですか?(ここでは注釈を使用しなかったため)

package com;

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

@XmlJavaTypeAdapter(SpecifierAdapter.class)
public class Specifier {


    Specifier(String v1 , String v2 , String v3)
    {

    }

    String value1;

    public String getValue1() {
        return value1;
    }

    public void setValue1(String value1) {
        this.value1 = value1;
    }

    public String getValue2() {
        return value2;
    }

    public void setValue2(String value2) {
        this.value2 = value2;
    }

    public String getValue3() {
        return value3;
    }

    public void setValue3(String value3) {
        this.value3 = value3;
    }

    String value2;
    String value3;

}
4

3 に答える 3

7

注:アダプターコードは、guava-libraryのJoinerとSplitterを使用して簡単にすることができます。

SampleRequest

public class SampleRequest
{
    @XmlAttribute
    private String user;

    @XmlAttribute
    private String account;

    @XmlAttribute(name = "Specifier")
    @XmlJavaTypeAdapter(SpecifierAdapter.class)
    private List<Specifier> specifier;
}

アダプタ

public class SpecifierAdapter extends XmlAdapter<String, List<Specifier>>
{
    @Override
    public List<Specifier> unmarshal(final String v) throws Exception
    {
        String[] values = v.split(":");
        List<Specifier> l = new ArrayList<Specifier>();
        for (String s : values)
        {
            String[] vs = s.split(",");
            l.add(new Specifier(vs[0], vs[1], vs[2]));
        }
        return l;
    }

    @Override
    public String marshal(final List<Specifier> v) throws Exception
    {
        String values = "";
        for (Specifier s : v)
        {
            values += s.getValue1() + "," + s.getValue2() + "," + s.getValue3() + " : ";
        }
        return values.length() > 0 ? values.substring(0, values.length() - 3) : values;
    }
}

使用法

public static void main(final String a[]) throws JAXBException
{
        SampleRequest r = new SampleRequest();
        r.setAccount("account");
        r.setUser("user");
        List<Specifier> sps = new ArrayList<Specifier>();
        sps.add(new Specifier("v1", "v2", "v3"));
        sps.add(new Specifier("a1", "a2", "a3"));
        r.setSpecifier(sps);

        JAXBContext jc = JAXBContext.newInstance(SampleRequest.class);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(r, System.out);
}

出力

<?xml version="1.0" encoding="UTF-8"?>
<sampleRequest user="user" account="account" Specifier="v1,v2,v3 : a1,a2,a3"/>
于 2012-08-10T14:23:07.760 に答える
2

IDEで答えを準備しました。

質問(11887278)を削除して、もう一度質問しました。

この要件は良い考えではないと思いました。属性に対してこれらの複数の文字列を実行したことがないため、私はあなたの質問に興味を持っていました。

私のコードは、SenthilKumarが説明したものと興味深いことに非常に似ています。

https://code.google.com/p/jinahya/source/browse/trunk/com.googlecode.jinahya/stackoverflow/src/main/java/com/googlecode/jinahya/stackoverflow/q11887278で完全なmavenizedプロジェクトをご覧ください//

お願いします

package com.googlecode.jinahya.stackoverflow.q11887278;


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.bind.annotation.adapters.XmlAdapter;


/**
 *
 * @author Jin Kwon <jinahya at gmail.com>
 */
public class SpecifierAdpater extends XmlAdapter<String, List<Specifier>> {


    @Override
    public List<Specifier> unmarshal(final String value) throws Exception {

        if (value == null) {
            return null;
        }

        final List<Specifier> bound = new ArrayList<Specifier>();
        for (String split : value.split(":")) {
            final Specifier specifier = new Specifier();
            specifier.fromString(split);
            bound.add(specifier);
        }
        return bound;
    }


    @Override
    public String marshal(final List<Specifier> bound) throws Exception {

        if (bound == null) {
            return null;
        }

        final StringBuilder builder = new StringBuilder();
        final Iterator<Specifier> specifiers = bound.iterator();
        if (specifiers.hasNext()) {
            builder.append(specifiers.next().toString());
        }
        while (specifiers.hasNext()) {
            builder.append(":");
            builder.append(specifiers.next().toString());
        }
        return builder.toString();
    }


}

それぞれがマーシャリングされていない10の例があります

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request user="user"/>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request/>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request user="user" account="account"/>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request specifiers="null,null,value3:null,value2,value3"/>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request specifiers="value1,null,value3"/>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request/>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request user="user" account="account" specifiers="value1,null,null"/>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request user="user" account="account" specifiers="null,null,null"/>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request specifiers="null,value2,value3"/>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request user="user" account="account"/>
于 2012-08-10T14:39:18.933 に答える
1

SpecifierAdapter.javaの次の実装を試すことができます

public class SpecifierAdapter extends XmlAdapter<String, List<Specifier>>{
  @Override
  public String marshal(List<Specifier> values) throws Exception {
    StringBuilder result = new StringBuilder();
    for(Specifier specifier : values) {
      result.append(specifier.toString()); //assuming you have overridden toString() method
      result.append(",");
    }
    return result.length>0? result.substring(0, result.length() - 1): "";
  }

  @Override
  public List<Specifier> unmarshal(String colonSeparated) throws Exception {   
    List<String> values =  Arrays.asList(colonSeparated.split(":"));
    List<Specifier> specifiers = new ArrayList<Specifiers>();
    for(String str : values){
        specifiers.add(new Specifier(str)); //here use your constructor appropriately
    }
    return specifiers;
  }
}
于 2012-08-10T13:51:41.443 に答える