2012-08-10 8 views
8

Estoy usando JAXB para el proceso de desmaterialización, para el cual la solicitud proviene de la interfaz de usuario para nuestra clase de servicio. El siguiente es el formato de solicitud XML.Confundido sobre cómo usar JAXB XML Adapter para mis requisitos

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

Mi requisito es que, el atributo especificador tiene múltiples series de valores (: dos puntos separados) i necesidad de asignar cada serie de valores a mi clase Java personalizada

Probé esta manera

@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; 
    } 

} 

parte Editado

el especificador de clase consta de 3 propiedades de tipo cadena.

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

y necesito cada serie de Prescripción por ejemplo (value1a, value1b, value1c) debería correlacionarse con valor1, valor2, valor3 respectivamente

Editado Parte 3

Hola , Gracias por la respuesta, traté de deshacer este ejemplo, lo que encontré es que, estoy obteniendo nulo

Esta es la solicitud pasé

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

Sólo quiero para asegurarse de que, es mi clase Especificador es correcta o no ?? (Como no usamos ningún Anotaciones aquí)

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; 

} 
+0

¿Cuáles son las propiedades de la clase que especifica y el cómo mapa al atributo Specifier xml? –

+0

Gracias Pangea, he editado mi pregunta para responder a su consulta. por favor mira . – Pawan

+0

He editado mi pregunta (estoy obteniendo un resultado nulo) cuando la desasignación podría dejarme saber si mi clase de especificador es correcta o no? – Pawan

Respuesta

6

NOTA: El código de adaptador podría simplificarse mediante el uso de guayaba-biblioteca de Joiner and Splitter .

SampleRequest

public class SampleRequest 
{ 
    @XmlAttribute 
    private String user; 

    @XmlAttribute 
    private String account; 

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

adaptador

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

Uso

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); 
} 

salida

<?xml version="1.0" encoding="UTF-8"?> 
<sampleRequest user="user" account="account" Specifier="v1,v2,v3 : a1,a2,a3"/> 
+0

agradable. gran ejemplo. – logoff

1

Usted puede tratar de la siguiente implementación de 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; 
    } 
} 
2

he estado preparado mi respuesta con mi IDE.

Has eliminado tu pregunta (11887278) y te hemos vuelto a preguntar.

Pensé y creo que este requisito no es una buena idea. Me interesaba su pregunta porque nunca hice esas cadenas múltiples para un atributo.

Mi código es curiosamente el mismo que explicó Senthil Kumar.

Por favor, vea el proyecto mavenized completo en https://code.google.com/p/jinahya/source/browse/trunk/com.googlecode.jinahya/stackoverflow/src/main/java/com/googlecode/jinahya/stackoverflow/q11887278/

favor

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(); 
    } 


} 

Aquí viene 10 ejemplos que cada uno está comandada un unmarshalled

<?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"/> 
Cuestiones relacionadas