Dropwizard(一)教程-简单搭建

原创 2015年11月21日 16:18:40

本人第一篇博客,简单介绍一下Dropwizard框架的搭建,多多指教

本人都是从官方网站上学习到的,游客们可以参考以下连接学习:dropwizard  Get-Start 

下面开始一步一步的搭建环境:(Intellij14.1, JDK1.7)

1.1 添加依赖包

<dependency>
	<groupId>io.dropwizard</groupId>
	<artifactId>dropwizard-core</artifactId>
	<version>0.8.5</version>
</dependency>
后面统一都用0.8.5这个版本,用Intellij 工具maven可以自动导入这些依赖包

1.2 添加yml文件

笔者认为这个文件类似于普通web项目中的 .xml文件,对一些的项目配置之类的,可以去https://github.com/dropwizard/dropwizard/tree/master/dropwizard-example   git-hub上的实例下载yml文件

以后会具体分析yml文件的各个关键字的具体用处,文件中很多东西是多出来的,必须要删除或者注释掉才能正常启动项目,此博客只简单介绍helloworld的项目(所有都是helloworld为第一个项目)

1.3 添加example.keystore 文件

同样的在上面那个地址去找,笔者只知道没有这个文件不能运行整个项目,具体作用不太清楚


2.1 写 Configuration 配置类

import io.dropwizard.Configuration;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.NotEmpty;

public class HelloWorldConfiguration extends Configuration {
    @NotEmpty
    private String template;

    @NotEmpty
    private String defaultName = "Stranger";

    @JsonProperty
    public String getTemplate() {
        return template;
    }

    @JsonProperty
    public void setTemplate(String template) {
        this.template = template;
    }

    @JsonProperty
    public String getDefaultName() {
        return defaultName;
    }

    @JsonProperty
    public void setDefaultName(String name) {
        this.defaultName = name;
    }
}
先简单的搭建起来,让项目能跑起来,具体的意义后面分析,包括其中的一些Annotation,有框架基础的一眼或许就能看懂,此处的template  和 defaultname 可以不要,但是和yml文件中的关键字是有关联的,如果要删除的话一定要将yml文件中的template 、defaultName一起删除,而且在后面的resource类中一个方法的参数也要改变(初学者建议就按照这个来,先让程序跑起来,然后在进行改动)


2.2  写应用Application 类

import io.dropwizard.Application;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import com.example.helloworld.resources.HelloWorldResource;

public class HelloWorldApplication extends Application<HelloWorldConfiguration> {
    public static void main(String[] args) throws Exception {
        new HelloWorldApplication().run(args);
    }

    @Override
    public String getName() {
        return "hello-world";//在项目启动之后,负责URL跳转
    }

    @Override
    public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
        
    }

    @Override
    public void run(HelloWorldConfiguration configuration,
                    Environment environment) {
       
    }

}
此类与Jersey 服务器有关,建立该项目的时候若想运行需要“注册”(笔者自己的理解)环境和配置,也就是与上文的配置类息息相关此时我们只是将关键代码展示,后面进行补充,一步一步say hello world

大部分的注册信息都放在 run方法中,涉及到数据库、页面层的一些初始化配置和资源配置,需要在initialize方法中写,以后的文章中会具体再写

2.3 写入API类

(此处其实不是必要的,但是上面两个继承了Configuration 和 Application 的两个类是必须要有的,本文先按照官网的example来写)

import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.Length;

public class Saying {
    private long id;

    @Length(max = 3)
    private String content;

    public Saying() {
        // Jackson deserialization
    }

    public Saying(long id, String content) {
        this.id = id;
        this.content = content;
    }

    @JsonProperty
    public long getId() {
        return id;
    }

    @JsonProperty
    public String getContent() {
        return content;
    }
}


2.4  写Resource 类

import com.example.helloworld.api.Saying;
import com.google.common.base.Optional;
import com.codahale.metrics.annotation.Timed;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.util.concurrent.atomic.AtomicLong;

@Path("/hello-world")
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorldResource {
    private final String template;
    private final String defaultName;
    private final AtomicLong counter;

    public HelloWorldResource(String template, String defaultName) {
        this.template = template;
        this.defaultName = defaultName;
        this.counter = new AtomicLong();
    }

    @GET
    @Timed
    public Saying sayHello(@QueryParam("name") Optional<String> name) {
        final String value = String.format(template, name.or(defaultName));
        return new Saying(counter.incrementAndGet(), value);
    }
}
此类 相当于其他框架中的Controller 、Action

其中的Annotation 先简单的解释一下,以后有机会详细介绍,因为我们这个项目中暂时没有视图层(dropwizard 到目前笔者了解到不支持jsp,只能支持freemarker和mustache作为视图层解析),所以“hello-world” 路径返回的是一个Json格式的数据而不是HTML格式的

@Path 为该项目的一个URL 可以直接跳转进入到此类中的方法,然后在后台进行处理

@Produces 为该类(或者方法)返回的数据类型,默认为Json格式

@Get 限制客户端访问时只能通过get方法访问

@QueryParam 为URL链接后面的参数(url ?{参数名} = {参数值} 的格式)

此处的Optional 类具体用法自行百度、谷歌,笔者也是初学者解释不清,此处的用法就是当参数(name)为空的时候调用defaultName


3.1 在run方法添加资源

在HelloWorldApplication 类中注册Resource资源,这就是上文讲过的,所有资源都必须到Application类中注册

在run方法中添加如下代码

@Override
public void run(HelloWorldConfiguration configuration,
                Environment environment) {
    final HelloWorldResource resource = new HelloWorldResource(
        configuration.getTemplate(),
        configuration.getDefaultName()
    );
    environment.jersey().register(resource);//environment环境类添加到Jersey服务器中
}

官网中有Template 模板检验,并不是必须的,笔者将这一块都略去了


3.2  maven 构建JAR包配置

添加如下代码到 pom文件中

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <configuration>
                    <createDependencyReducedPom>true</createDependencyReducedPom>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.example.helloworld.HelloWorldApplication</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
将该文件更改之后,整个项目基本就算完成了,我们尝试一下运行

直接到Application 类中运行主线程 main方法


3.3  运行环境更改(配置) 

首先得用maven打包项目为jar包

可以用开发工具快速打包


其实这一块,笔者也不太懂原理,有懂的可以留言交流

打包之后运行主程序


可能会出现上图的问题,我们在运行配置中更改一下参数就可以了(当然也可以直接用命令行启动程序时,加入参数,像官网上 java -jar target/****-1.0-SNAPSHOT.jar server ****.yml) 其中的 * 号是与你自己命名的

有的同学可能不知道Intellij 程序参数怎么更改,截图教大家

搞定之后就可以运行了

4.1  可能出现的问题

   yml 文件中多余的参数,如果你按照此文章来一步一步做的话,yml 文件中参数肯定有多余的,因为我们并没有配置数据库的资源类,也没有template的校验等,但是下载的yml文件却是完整的包含这些内容的,所以出现一些多余参数只需要注释掉,或者删除掉,以后用到的时候再加上。

  yml文件中的参数的格式不同于xml 和 properties文件,而且格式要求比较高,有时候多一个空格就会报错(参数的开头处多个空格,总之格式挺严格的)

  出现的其他问题,一般都是配置或者路径问题了


运行成功之后再localhost:8080/hello-world  (localhost:8080/hello-world?name=*****)可以看到结果

整个项目的结构如下图

















版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Dropwizard框架入门

最近项目用到了Dropwizard框架,个人感觉还不错,那么这里就从他们官网入手,然后加上自己的实现步骤让大家初步了解这个框架。 官网对DW(Dropwizard)的定义是跨越了一个库和框架之间的界限...

Django 性能测试——一个现实世界的例子

Django 性能测试——一个现实世界的例子   Django 性能测试——一个现实世界的例子 2008年4月28日 大约一个星期前,安德鲁 和 我 启...

Nginx负载均衡配置与spring+redissession共享

ngnix配置(安装启动等百度搜索,很多很多。) #user nobody; worker_processes 1; #error_log logs/error.log; #error_log...

Heroku:快速部署Dropwizard开发的RESTful Service

上一篇博客《Dropwizard:用Java轻轻的写一个RESTful Service》中讲到了使用Dropwizard可以快速的开发出一个RESTful service,同时因为Dropwizard...

REST面向资源架构 RESTful架构

REST基础概念: 在REST中的一切都被认为是一种资源。 每个资源由URI标识。 使用统一的接口。处理资源使用POST,GET,PUT,DELETE操作类似创建,读取,更新和删除(CRUD...

如何优化 Django REST Framework 的性能?

现在,Django REST Framework 帮助 Django 开发者给自己的应用开发出简单而强大的标准 REST APIs,而且现在我们已经成功的应用在了一些 Django Web 项目上。然...

Dropwizard(二) hibernate连接Mysql数据库

分享一下官网的连接:Dropwizard Hibernate整合  作者自己没有采用JDBI来连接数据库,而是采用了dropwizard-hibernate 框架连接数据库,并进行处理数据。 结合官网...
  • sf_cyl
  • sf_cyl
  • 2015-11-30 22:05
  • 1122

Java RESTful框架的性能比较

在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元。

基于dropwizard/metrics ,kafka,zabbix构建应用统计数据收集展示系统

新blog地址:http://hengyunabc.github.io/about-metrics/想要实现的功能 应用可以用少量的代码,实现统计某类数据的功能 统计的数据可以很方便地展示 metri...

Beam从零开始(一)

网上看了别人都在谈Beam,你说咱们作为技术人员技术也得紧跟着时代不是,所以也开始利用业余时间研究Beam。咱不是大神,不能啥都一看就会,所以一天一天来,这个也就作为笔记吧。废话不多说,进入主题,按照...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)