JavaFX2 с веб-службой Restful

Я начал пробовать JavaFX2.2, отправляя запросы к веб-службе RESTful. Чтобы создать свой веб-сервис, я следовал этому руководству по Netbeans: http://netbeans.org/kb/docs/websvc/rest.html (на основе моей базы данных).

Объекты, конфигурация и пакет услуг были успешно сгенерированы, и когда я тестирую службу, щелкнув правой кнопкой мыши мой проект и выбрав «Проверить веб-службу RESTful...», кажется, что все работает (получая ответ XML)

Теперь я пытаюсь создать приложение JavaFX2, которое выполняет запросы к этому веб-сервису. Для этого я использую клиент Джерси (также сгенерированный Netbeans 7.2) на основе моей службы DAPFacadeREST. Когда я нажимаю кнопку в своем приложении, выполняется следующее:

NewJerseyClient njc = new NewJerseyClient();

String s = njc.find_XML(String.class, "1");  

System.out.println("Output from Server .... \n");
System.out.println(s);

Это дает мне следующий ответ от сервера:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <dap>
        <adres>Street 1</adres>
        <btw></btw>
        <contactPersoon></contactPersoon>
        <dapid>1</dapid>
        <email>[email protected]</email>
        <gemeente>RandomCity</gemeente>
        <land>België</land>
        <naam>Paul The Man</naam>
        <postcode>9999</postcode>
        <tel>+32999 88 77 66</tel>
    </dap>

Эта информация верна, но теперь я застрял. Я хочу, чтобы это было преобразовано в объект JavaFX2, желательно примерно так:

public class DAP {
    private  SimpleIntegerProperty DAPID = new SimpleIntegerProperty();
    private  SimpleStringProperty naam = new SimpleStringProperty("");
    private  SimpleStringProperty contactPersoon = new SimpleStringProperty("");
    private  SimpleStringProperty adres = new SimpleStringProperty("");
    private  SimpleStringProperty postcode = new SimpleStringProperty("");
    private  SimpleStringProperty gemeente = new SimpleStringProperty("");
    private  SimpleStringProperty land = new SimpleStringProperty("");
    private  SimpleStringProperty telefoonnummer = new SimpleStringProperty("");
    private  SimpleStringProperty btw = new SimpleStringProperty("");
    private  SimpleStringProperty email = new SimpleStringProperty("");

    //constructor, getters & setters below

Это вообще возможно? Я имею в виду, что с SOAP вы можете использовать прокси-классы, но там SimpleIntegerProperty не известны на стороне сервера (JavaEE 6). Вот почему я иду с REST. Будет ли это такой же проблемой, как с SOAP? Поскольку на стороне сервера (в веб-службе RESTful) сгенерированные сущности выглядят следующим образом:

public class DAP implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "DAPID")
private Integer dapid;
@Basic(optional = false)
@NotNull
@Lob
@Size(min = 1, max = 65535)
@Column(name = "Naam")
private String naam;
@Basic(optional = false)
@NotNull
@Lob
@Size(min = 1, max = 65535)
//etc

Поле «naam» — это просто обычная строка, где я хочу, чтобы она была SimpleStringProperty на стороне моего клиента.

Я уже кое-что прочитал о JAXB, но я не понимаю, что я должен создать на стороне клиента и что я должен создать на стороне сервера. Если я не ошибаюсь, я должен где-то сделать файл xsd? Но опять же, будет ли это поддерживать тип SimpleStringProperty?

Извините за длинные сообщения, но я надеюсь, что кто-то может мне помочь... Заранее спасибо.


person Perneel    schedule 12.09.2012    source источник


Ответы (1)


Вы можете создать XmlAdapter для обработки SimpleStringProperty. Поскольку JAXB (JSR-222) является стандартным уровнем привязки для веб-служб JAX-WS (SOAP) и JAX-RS (RESTful), вы можете использовать этот подход для обоих. XmlAdapter будет выглядеть примерно так:

public class SimpleStringPropertyAdatper extends XmlAdapter<String, SimpleStringProperty> {

   @Override
    public SimpleStringProperty unmarshal(String v) throws Exception {
        return new SimpleStringProperty(v);
    }

    @Override
    public String marshal(SimpleStringProperty v) throws Exception {
        if(null == v) {
            return v;
        }
        return v.getString(); // Or whatever the correct method is
    } 

}

Аннотация @XmlJavaTypeAdapter используется для настройки XmlAdapter, вы можете сделать это в информации о пакете, используя класс package-info, чтобы указать, что адаптеры должны использоваться для всех экземпляров указанных классов.

@XmlJavaTypeAdapters({
    @XmlJavaTypeAdapter(value=SimpleStringPropertyAdapter.class, type=String.class),
    @XmlJavaTypeAdapter(value=SimpleIntegerPropertyAdapter.class, type=Integer.class),
})
package com.example;

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

Для получения дополнительной информации

person bdoughan    schedule 12.09.2012
comment
кажется, что ваш сайт блога недоступен в настоящее время :( Однако, спасибо уже за ответ, это заставило меня двигаться. Тем не менее, я еще не заставил его работать, но я получаю общую картину того, что должно произойти. Если у меня есть больше проблем , задам еще вопрос :) - person Perneel; 14.09.2012