【问题标题】:JavaFX2 with Restful Web Service带有 Restful Web 服务的 JavaFX2
【发布时间】:2012-09-12 14:33:38
【问题描述】:

我开始尝试 JavaFX2.2 向 RESTful 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。

我已经在 J​​AXB 上进行了一些阅读,但我不知道应该在客户端创建什么以及应该在服务器端创建什么。如果我没记错的话,我必须在某处制作一个 xsd 文件?但同样,这会支持 SimpleStringProperty 作为类型吗?

抱歉,帖子很长,但我希望有人可以帮助我...提前致谢。

【问题讨论】:

    标签: jakarta-ee jersey javafx-2


    【解决方案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.*; 
    

    更多信息

    【讨论】:

    • 目前您的博客站点似乎不可用 :( 但是,已经感谢您的回答,它让我继续前进。虽然我还没有让它工作,但我得到了大致的了解发生。如果我有更多问题,我会提出另一个问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多