java - RESTful MySQL/术语/传递参数/返回整数和 double

标签 java mysql json rest netbeans

因此,为了创建MySQL数据库的RESTful前端,我简要介绍了phprestql(简单易行,但太简单了),现在我尝试将其构建到NetBeans' tutorial上。我已经完成了基本教程,并且可以很好地使用数据库。但是,我试图弄清楚如何对其进行自定义。

  • 即使在MySQL表中,属性是Big Ints,Ints和Doubles,JSON中的所有结果似乎都是字符串。在netbeans源中,这些类型似乎也已正确设置。但是,JSON以字符串形式返回所有内容。有什么想法可以解决这个问题吗? (再次,尽管我的数据库是我,但我只是在上面的教程中工作。)
  • 我还试图弄清楚如何在URI中实现其他参数,以进一步优化数据库结果。 (http://localhost/the_db/people_table/?gender_property = male&updated_property = 2011-01-18)...将返回所有符合这些条件的人员行。我的问题之一是我什至不确定这种功能的正确术语,因此要在其上查找示例和教程变得有些困难。
  • 这可能与上一项有关,但是我还想使用URI来“向下钻取”到表/行/属性中以返回单个值(在JSON中)...(http://localhost/the_db/people_table/42/lastname)...将返回{“Jones”}

  • 问题的部分原因是我几乎不了解Ruby的Java和Python。但是,我对在Objective-C,PHP和Perl中进行破坏的东西非常熟悉。但是,关于快速轻松的Restful MySQL服务的教程似乎并不流行或盛行。

    [编辑]

    在某种程度上,这有助于回答问题#1,我附加了一些java方法,以指示如何设置/检索数字属性……据我所知,某些库可以自动生成实际的JSON。我在这里看不到它:
    /** in the MySQL CommitteeObj table, the committeeId is set as follows */
    /* `committeeId` bigint(11) NOT NULL auto_increment */
    
    /** in committee.java */
    public class committee implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "committeeId")
        private BigInteger committeeId;
    //.....
    }
    
    public committee(BigInteger committeeId) {
        this.committeeId = committeeId;
    }
    
    @Override
        public String toString() {
            return "texlege.committee[committeeId=" + committeeId + "]";
        }
    
    /** in committeeConverter.java */
    
    @XmlElement
    public BigInteger getCommitteeId() {
        return (expandLevel > 0) ? entity.getCommitteeId() : null;
    }
    
    public void setCommitteeId(BigInteger value) {
        entity.setCommitteeId(value);
    }
    
    /** in committeeResource.java */
    
    @GET
        @Produces({"application/json"})
        public committeeConverter get(@QueryParam("expandLevel")
                                      @DefaultValue("1")
        int expandLevel) {
            return new committeeConverter(getEntity(), uriInfo.getAbsolutePath(), expandLevel);
        }
    
    protected committee getEntity() {
            try {
                return (committee) em.createQuery("SELECT e FROM committee e where e.committeeId = :committeeId").setParameter("committeeId", id).getSingleResult();
            } catch (NoResultException ex) {
                throw new WebApplicationException(new Throwable("Resource for " + uriInfo.getAbsolutePath() + " does not exist."), 404);
            }
        }
    }
    

    这是特定委员会的查询结果。请注意,commitId,commissionType和parentId属性明显缺少JSON编号:
    {
        "@uri":"http://localhost:8080/TexLegeRest/rest/committees/2735/",
        "clerk":"Amy Peterson",
        "committeeId":"2735",
        "committeeName":"Appropriations",
        "committeeType":"1",
        "parentId":"-1",
        "updated":"2011-02-20T00:00:00-06:00",
    }
    

    最佳答案

    简而言之,这个答案可能根本不是您要寻找的答案,因为它与NetBeans无关。但是,它确实提供了一种不同的方式,可以为MySQL数据库提供RESTful接口(interface)。

    我的uploaded a zip file具有4个Java文件,2个XML文件和1个文本文件来支持此解决方案,否则答案可能会很长。

    简而言之,这是一个Maven/Java/Spring/Hibernate/MySQL解决方案,原因是我最近一直在使用这种体系结构,并且发现执行简单的转换SQL↔JSON的过程非常简单且功能强大!

    该解决方案还使用其他一些工具(例如Maven)来进行编译/打包/部署,而不是使用IDE,在我看来,这消除了一定程度的复杂性,但可能会使一些热爱IDE的人失望。

    系统配置

    因此,首先,如果您还没有Java和Maven,则需要下载并解压缩/安装它们。我还将假设使用Windows,主要是因为这是我当前正在使用的。我将这些应用程序安装在以下位置:

    c:\apps\java\jdk1.6.0_24
    c:\apps\apache-maven-3.0.3
    

    由于此解决方案中没有IDE,因此将在命令行中构建和运行该应用程序。这里只有很少的配置,因此只需执行以下命令即可设置一些环境变量:
    set JAVA_HOME=c:\apps\java\jdk1.6.0_24输入
    set M2_HOME=c:\apps\apache-maven-3.0.3输入
    set PATH=%PATH%;%M2_HOME%\bin;%JAVA_HOME%\bin输入

    然后键入mvn --version可以用来验证是否正确安装了Java和Maven并找到了它们。

    项目创建

    为您的源创建一个目录,让我们使用c:\src\project1
    再次在命令行上,导航到该目录并执行:
    mvn archetype:generate -DgroupId=my.group -DartifactId=project1 -DarchetypeArtifactId=maven-archetype-quickstart
    

    Maven将下载一些标准库,并最终提示您“为属性'version'定义值:”-只需输入以继续。然后,Maven将要求您确认项目设置,因此只需再次按Enter即可确认。您将最终得到一个目录结构,在该目录结构中您将找到一个pom.xml文件和两个Java文件。项目对象模型(POM)文件告诉Maven如何构建/测试/打包/部署(以及更多)您的项目。您需要向该文件添加一些库,以便我们可以使用Spring,JSON,Jetty和其他功能。因此,编辑pom.xml,将以下内容添加到XML结构中:

    <project>元素下(即<url>元素的同级元素)添加:
    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <spring.version>3.0.5.RELEASE</spring.version>
    </properties>
    <repositories>
      <repository>
        <id>JBoss</id>
        <url>https://repository.jboss.org/nexus/content/groups/public/</url>
        <releases>
          <enabled>true</enabled>
          <updatePolicy>always</updatePolicy>
          <checksumPolicy>warn</checksumPolicy>
        </releases>
      </repository>
    </repositories>
    

    <dependencies>元素下,从上面链接的zip文件中添加dependencies.txt文件的内容。这些更改将使Maven可以找到最新的HibernateSpring库,这些库并不总是存在于默认Maven存储库中,还可以找到其他库(如HSQLDB)–用来测试此示例和JSON Java转换的内存数据库。

    同样在<project>元素下(我在</dependencies>元素之后添加了它)添加以下内容:
    <build>
      <plugins>
        <plugin>
          <groupId>org.mortbay.jetty</groupId>
          <artifactId>maven-jetty-plugin</artifactId>
          <version>6.1.26</version>
          <configuration>
            <contextPath>/${project.artifactId}</contextPath>
            <scanIntervalSeconds>10</scanIntervalSeconds>
            <webXml>${project.build.directory}/${project.build.finalName}/WEB-INF/web.xml</webXml>
          </configuration>
        </plugin>
      </plugins>
    </build>
    

    这是嵌入式Web服务器,我们将使用它运行您将要构建的.war文件,这将导致pom.xml的最终更改……文件顶部附近的<packaging>元素需要更改为war而不是jar

    再次在命令行上,导航到刚才创建的项目目录,其中pom.xml可能位于其中(可能是cd project1),然后键入mvn compile。 Maven应该下载我们刚刚在POM中添加的所有新库,并希望编译时不会出错。现在,我们只需要配置Spring以连接所有RESTful URL和Bean并配置Web应用程序本身。

    在/src/main下创建2个新目录,分别称为resourceswebapp/WEB-INF。您的目录结构现在应如下所示:
    src
    src/main
    src/main/java
    src/main/resources
    src/main/webapp/WEB-INF
    

    resources中,从zip文件中添加名为applicationContext.xml的文件。 ApplicationContext是应用程序的配置。

    WEB-INF目录中,从zip文件中添加名为web.xml的文件。 web.xml描述了Web容器(例如Tomcat或在我们的示例中为Jetty)应如何部署应用程序。

    现在我们需要添加一些代码!该zip文件包含4个类,而不是在此处添加代码并使此答案的长度超出已有的时间。只需将它们复制到src/main/java/my/group目录中,即可在此过程中覆盖App.java

    编译与执行

    这是您应该努力的地方……因为您应该能够使用mvn compile来编译类,然后使用mvn jetty:run-war成功地使用应用程序war文件运行Web服务器。如果启动应用程序没有错误,那么在Jetty的初始化完成后,应该会有一些类似于INFO: Mapped URL path [/people] onto handler 'app'的日志记录。

    测试REST接口(interface)

    现在我们可以测试RESTful URL。我建议将Poster addon用于Firefox(尽管与Firefox 4不兼容),所以请安装此文件,然后我们就可以使用它在project1网络应用程序上执行PUT和GET请求。安装后,选择工具→海报或Ctrl + Alt + P。

    首先,由于我们使用的是Spring content negotiation(向下滚动至Content Negotiation部分),因此您需要配置Poster以添加正确的内容类型。只需将application/json添加到此字段即可。要将添加到我们的数据库中,只需添加
    {"firstName" : "foo", "lastName" : "bar"}
    

    贴到 body 上(这是Poster附加组件中的大区域),然后使用PUT按钮。您应该从Web应用程序获得响应,并在命令窗口中查看日志。响应应为:
    {"name":"foo bar","id":1,"height":1.8}
    

    这是有效的JSON,您可以看到整数和 double 数都很好。如果您从zip文件中查看Person.java类,则可以看到firstNamelastName是实际类成员的名称,它们与PUT的JSON key 的名称相匹配。我在其中添加了一个@JsonIgnore annotation,并创建了一个不同的@JsonProperty来返回全名。实际上,您可能不会这样做,否则很难仅更新名字或姓氏,但是在此示例中,我仅使用它来表明您完全控制了返回的JSON实体及其名称/值。还要注意,Person类具有硬编码的Double(height成员),以演示数字已正确序列化为JSON。

    然后,您可以通过将URL更改为http://localhost:8080/project1/people/1并使用GET按钮来检索人1 ,而该按钮仅返回相同的JSON。

    交换HSQLDB for MySQL

    您可能已经注意到,到目前为止还没有MySQL数据库。您将需要更改一些配置以指向MySQL数据库,而不是指向到目前为止已使用的内存中HSQL数据库。应该像这样更新“dataSource” bean属性:
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
      p:driverClassName="com.mysql.jdbc.Driver"
      p:url="jdbc:mysql://localhost:3306/name_of_your_database_instance"
      p:username="your_database_username"
      p:password="your_database_password"/>
    

    您需要在其中指定数据库的连接详细信息。

    最后, hibernate 方言需要更新为MySQL,因此将org.hibernate.dialect.HSQLDialect替换为
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
    

    applicationContext.xml文件中。

    警告,当Hibernate配置了以下属性<prop key="hibernate.hbm2ddl.auto">create</prop>时,它将在启动Web应用程序时销毁数据库,因为Hibernate正在扫描Person类并通过@ Table,@ Entity和@Column(及其他)创建表。 )注释。

    请注意,不幸的是我没有测试最后一部分,因为我没有安装MySQL,但希望它能工作。

    回答您的问题(或不回答)

    1)不知道,对不起。看起来只是一个转换/序列化问题,可以通过查看教程中使用的bean和检查其文档来解决。

    2)和3)使用上述解决方案,您可以根据需要添加任意多个路径变量,例如
    @RequestMapping(value = "/people/gender/{gender}/updated/{lastUpdated}", method = RequestMethod.GET)
    @ResponseBody
    public Person findByGenderAndUpdated(@PathVariable String gender, @PathVariable String lastUpdated) {}
    

    创建一个API来公开各个属性可能不切实际。通过URL返回全部资源更为实用,然后,如果需要的话,只需让下游组件从Person JSON对象中选择lastName即可。但是,如果有很多数据,我可能会看到需要一个Person的简化JSON表示形式。即,从带宽角度讲,消除某些大数据属性的效率更高。

    您必须自己为每种组合实现这些方法。这有效地构成了您的RESTful API。如果您需要创建一个文档来描述您的API,那么Atlassian guidelines会写得很好。

    概括

    此解决方案有多种变体,实际上,您应该将类​​放在更好的目录结构(模型, View , Controller )中,并创建一些Java类模板来处理持久性,因为所有模型都需要“保存”,“查找”方法为例。

    我希望这个解决方案对某人有用:-)

    关于java - RESTful MySQL/术语/传递参数/返回整数和 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5207735/

    相关文章:

    java - 如何将在 iOS 或 Android 上运行的 JavaFX 应用程序连接到 native 库?

    java - 使用 java 获取用参数替换的 SQL 字符串

    c++ - QMYSQL查询失败

    java - Firestore关系数据模型

    mysql - 存储过程

    mysql - 与同表的增量数据进行Join

    javascript - 如果嵌套对象具有特定值,则从数组中删除对象

    jquery - Struts2+Jquery+JSON - 一些麻烦

    c# - 匿名类型的单元测试 - JSON

    java - 当用户在 JComboBox 中选择一个项目时,如何创建一个监听器