У меня проблемы с пространствами имен. Мне нужно разобраться с публичным api (Prestashop). Это апи имеет XML как XLink типа, как показано ниже:JAXB + JERSEY. Как размонтировать несколько пространств имен
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<products>
<product id="1" xlink:href="http://localhost:8080/prestashop/api/products/1"/>
<product id="2" xlink:href="http://localhost:8080/prestashop/api/products/2"/>
</products>
</prestashop>
API-интерфейс для каждого продукта:
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<product>
<id>
<![CDATA[ 1 ]]>
</id>
<id_manufacturer xlink:href="http://localhost:8080/prestashop/api/manufacturers/1">
<![CDATA[ 1 ]]>
</id_manufacturer>
<id_supplier xlink:href="http://localhost:8080/prestashop/api/suppliers/1">
<![CDATA[ 1 ]]>
</id_supplier>
<id_category_default xlink:href="http://localhost:8080/prestashop/api/categories/3">
<![CDATA[ 3 ]]>
</id_category_default>
</product>
</prestashop>
Я создал два пакета, который содержит классы Pojo для каждого XML. Я хотел бы получить свойства любого продукта с указанием идентификатора из списка продуктов.
У меня есть продукт с пространством имен в @XMLSchema, но это пространство имен статично только для одного пути. Я знал, что это не способ сделать это.
Ниже, мой клиентский класс.
public class ClientPrestashop{
public static final Logger log = Logger.getLogger(ClientPrestashop.class.getCanonicalName());
private final String pass = "LA4DKY4AVJUODHCX0H0XH8E7EROV05J6";
private final String url="http://[email protected]:8080/prestashop/api/";
public Object getPrestashopPackageProducts(String path, Class<?> clase) throws JAXBException, Exception{
ClientConfig config= new DefaultClientConfig();
Client client = Client.create(config);
client.addFilter(new HTTPBasicAuthFilter(pass, ""));
WebResource webresource = client.resource(url + path);
ClientResponse response = webresource.type(MediaType.APPLICATION_XML).get(ClientResponse.class);
mostrar(response.getStatus());
JAXBContext jaxbContext = JAXBContext.newInstance(clase);
//Crear XMLFilter
XMLFilter filter = new NamespaceFilter(url+path,true);
//El XMLReader será encapsulado en nuestro XMLFilter.
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
filter.setParent(xr);
//Modificar UnmarshalerHandler como ContentHandler en XMLFilter
Unmarshaller unmarshall = jaxbContext.createUnmarshaller();
UnmarshallerHandler unmarshallerHandler = unmarshall.getUnmarshallerHandler();
filter.setContentHandler(unmarshallerHandler);
//Parse del XML
InputSource sr = new InputSource(response.getEntityInputStream());
filter.parse(sr);
Object presta = unmarshallerHandler.getResult();
return presta;
}
Здесь у вас есть код: https://github.com/JorgeP86/webservice.git
Можете ли вы помочь мне, пожалуйста?
Я думаю, что вы можете быть в состоянии регулировки ожидаемой схемы URL в созданном пакете -info.java. Там должна быть аннотация. Если нет, вы можете использовать Castor, который немного менее строг при квалифицированных ограничениях имени. –
Спасибо, Jamel Toms. Мой пакет-информация не генерировалась автоматически из данной xml-схемы. Я должен создать новый пакет, а затем заполнить следующий код '@XmlSchema (namespace =" http: // LA4DKY4AVJUODHCX0H0XH8E7EROV05J6 @ localhost: 8080/prestashop/api/products/1 ")' elementFormDefault = XmlNsForm.QUALIFIED ,. Затем я создал классы POJO с JAXB. – Jorge
Но это пространство имен предназначено только для одного продукта, если я хочу .../products/2 Мне нужно его изменить. Как получить все пространства имен? – Jorge