Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ entirely with spring, and tell the spring service which components to enable usi
With **dropwizard-spring** it is not necessary to subclass `com.yammer.dropwizard.Service`, instead you reference the provided
`com.hmsonline.dropwizard.spring.SpringService` class as your service class.

With **dropwizard-spring** 0.7+ it is possible to use your own `com.yammer.dropwizard.Service` (Application in dropwizard 0.7)
and use the provided `com.hmsonline.dropwizard.spring.SpringBundle` class by adding `bootstrap.addBundle(new SpringBundle());`
to the `initialize` method of your dropwizard Service/Application class. This allows you to subclass the SpringServiceConfiguration
dropwizard Configuration object to add your own configuration settings, and also introduce your own logic into your
dropwizard Service/Application.

## Maven Configuration

Expand Down Expand Up @@ -108,6 +113,34 @@ This is required to have maven build a "fat," executable jar file.
configLocations:
- conf/dropwizard-beans.xml

# Beans to be created from the configuration provided
# These will be constructed *before* the configLocations are parsed allowing their values to be used.
#
# Example below reflects this equivalent spring XML config:
# <bean name="uniqueBeanNameHere" class="class.to.Construct">
# <property name="key1" value="value1"/>
# <property name="key2" value="1234"/>
# <property name="key3" value="true"/>
# </bean>
# <bean name="remoteApi" class="com.myapp.config.RemoteAP">
# <property name="url" value="http://api.domain.com/rest/v2/"/>
# <property name="username" value="myuser"/>
# <property name="password" value="some-password-hash"/>
# </bean>
beans:
uniqueBeanNameHere:
clazz: class.to.Construct
config:
key1: "value1"
key2: 1234
key3: true
remoteApi:
clazz: com.myapp.config.RemoteAPI
config:
url: "http://api.domain.com/rest/v2/"
username: "myuser"
password: "some-password-hash"

# Servlet Filter
# List of FilterConfiguration
filters:
Expand Down
8 changes: 7 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<groupId>com.hmsonline</groupId>
<artifactId>dropwizard-spring</artifactId>
<version>0.6.2-SNAPSHOT</version>
<version>0.7.0-SNAPSHOT</version>
<packaging>jar</packaging>
<description>Spring Integration for DropWizard</description>
<url>https://github.com/hmsonline/dropwizard-spring</url>
Expand All @@ -30,6 +30,7 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<dropwizard.version>0.7.0</dropwizard.version>
<spring.version>3.2.8.RELEASE</spring.version>
<beanutils.version>1.7.0</beanutils.version>
</properties>

<scm>
Expand Down Expand Up @@ -67,6 +68,11 @@
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>${beanutils.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (c) 2015 Hardiker Ltd.
package com.hmsonline.dropwizard.spring;

import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Map;

public class BeanConfiguration {

@JsonProperty
private String clazz; // Filter class.

@JsonProperty
private Map<String, Object> config; // Init params.

public String getClazz() {
return clazz;
}

public void setClazz(String clazz) {
this.clazz = clazz;
}

public Map<String, Object> getConfig() {
return config;
}

public void setConfig(Map<String, Object> config) {
this.config = config;
}
}
119 changes: 119 additions & 0 deletions src/main/java/com/hmsonline/dropwizard/spring/SpringBundle.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
// Copyright (c) 2015 Hardiker Ltd.
package com.hmsonline.dropwizard.spring;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.hmsonline.dropwizard.spring.web.XmlRestWebApplicationContext;
import io.dropwizard.ConfiguredBundle;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import org.springframework.context.ApplicationContext;

import java.util.List;


public class SpringBundle implements ConfiguredBundle<SpringServiceConfiguration> {

SpringService service = new SpringService();

@Override
public void initialize(Bootstrap<?> bootstrap) {
// This is needed to avoid an exception when deserializing Json to an ArrayList<String>
bootstrap.getObjectMapper().enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
}

@Override
public void run(SpringServiceConfiguration configuration, Environment environment) {
SpringConfiguration config = configuration.getSpring();

ApplicationContext parentCtx = initSpringParent();

Dropwizard dw = (Dropwizard) parentCtx.getBean("dropwizard");
dw.setConfiguration(configuration);
dw.setEnvironment(environment);

parentCtx = wrapApplicationContext(parentCtx, config);
parentCtx = initSpringConfigBasedBeans(parentCtx, config);

ApplicationContext appCtx = initSpring(config, parentCtx);
loadResourceBeans(config.getResources(), appCtx, environment);
loadHealthCheckBeans(config.getHealthChecks(), appCtx, environment);
loadManagedBeans(config.getManaged(), appCtx, environment);
loadLifeCycleBeans(config.getLifeCycles(), appCtx, environment);
loadJerseyProviders(config.getJerseyProviders(), appCtx, environment);
loadTasks(config.getTasks(), appCtx, environment);

// Load filter or listeners for WebApplicationContext.
if (appCtx instanceof XmlRestWebApplicationContext) {
try {
loadWebConfigs(environment, config, appCtx);
} catch (ClassNotFoundException e) {
throw new RuntimeException("CNFE when loading spring web configs: " + e.getMessage(), e);
}
}

enableJerseyFeatures(config.getEnabledJerseyFeatures(), environment);
disableJerseyFeatures(config.getDisabledJerseyFeatures(), environment);
}

/**
* This allows you to wrap the ApplicationContext, potentially with another ApplicationContext to extend the base
* functionality to meet your needs. Don't forget to refresh any new ApplicationContext's you create!
*
* @param parent Root Application Context
* @param config SpringConfiguration object for reference
* @return Application Context for further use
*/
@SuppressWarnings("unused")
protected ApplicationContext wrapApplicationContext(ApplicationContext parent, SpringConfiguration config) {
return parent;
}

void loadWebConfigs(Environment environment, SpringConfiguration config, ApplicationContext appCtx) throws ClassNotFoundException {
service.loadWebConfigs(environment, config, appCtx);
}

void loadResourceBeans(List<String> resources, ApplicationContext ctx, Environment env) {
service.loadResourceBeans(resources, ctx, env);
}

void loadHealthCheckBeans(List<String> healthChecks, ApplicationContext ctx, Environment env) {
service.loadHealthCheckBeans(healthChecks, ctx, env);
}

void loadManagedBeans(List<String> manageds, ApplicationContext ctx, Environment env) {
service.loadManagedBeans(manageds, ctx, env);
}

void loadLifeCycleBeans(List<String> lifeCycles, ApplicationContext ctx, Environment env) {
service.loadLifeCycleBeans(lifeCycles, ctx, env);
}

void loadJerseyProviders(List<String> providers, ApplicationContext ctx, Environment env) {
service.loadJerseyProviders(providers, ctx, env);
}

void loadTasks(List<String> tasks, ApplicationContext ctx, Environment env) {
service.loadTasks(tasks, ctx, env);
}

void enableJerseyFeatures(List<String> features, Environment env) {
service.enableJerseyFeatures(features, env);
}

void disableJerseyFeatures(List<String> features, Environment env) {
service.disableJerseyFeatures(features, env);
}

ApplicationContext initSpringParent() {
return service.initSpringParent();
}

ApplicationContext initSpringConfigBasedBeans(ApplicationContext parent, SpringConfiguration springConfiguration) {
return service.initSpringConfigBasedBeans(parent, springConfiguration);
}

ApplicationContext initSpring(SpringConfiguration config, ApplicationContext parent) {
return service.initSpring(config, parent);
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// Copyright (c) 2012 Health Market Science, Inc.
// Extended by Hardiker Ltd

package com.hmsonline.dropwizard.spring;

Expand Down Expand Up @@ -35,6 +36,9 @@ public class SpringConfiguration extends Configuration {
@JsonProperty
private List<String> resources;

@JsonProperty
private Map<String, BeanConfiguration> beans;

@JsonProperty
private List<String> healthChecks;

Expand Down Expand Up @@ -75,6 +79,10 @@ public List<String> getResources() {
return resources;
}

public Map<String, BeanConfiguration> getBeans() {
return beans;
}

public List<String> getHealthChecks() {
return healthChecks;
}
Expand Down
Loading