JavaFX2与Restful Web服务

时间:2012-09-12 14:33:38

标签: java-ee jersey javafx-2

我开始试用JavaFX2.2向RESTful Web服务发出请求。为了创建我的web服务,我遵循了这个Netbeans指南:http://netbeans.org/kb/docs/websvc/rest.html(基于我的数据库)。

实体,配置和服务包是成功生成的,当我通过右键单击我的项目并选择“测试RESTful Web服务......”来测试服务时,它似乎都可以工作(获取XML响应)

现在我尝试创建一个JavaFX2应用程序来处理对此Web服务的请求。为此,我使用基于我的DAPFacadeREST服务的Jersey客户端(也由Netbeans 7.2生成)。当我点击我的应用程序中的按钮时,会执行以下操作:

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>blablabla@skynet.be</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 Web服务上),生成的实体看起来如下所示:

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作为类型吗?

对不起,我希望有人可以帮助我...提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以创建XmlAdapter来处理SimpleStringProperty。由于JAXB(JSR-222)是JAX-WS(SOAP)和JAX-RS(RESTful)Web服务的标准绑定层,因此您可以使用此方法。 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.*; 

了解更多信息