What has happened?
Two things happened.
- Many developers store all their custom views, models and related logic in a web application.
- When developer want to implement a custom module, they often have no idea what should they do.
Why can’t I just store it all in a webapp?
You definitely can.
But whilst this is more than acceptable or even recommended for small projects, it may become a mess when a project grows. That time it’s a good idea to move the stuff into a custom DXA module.
Ok, let’s give it a try. How?
Creating a new module is simple but of course requires some effort.
-
Create a new Maven project by executing
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart
NOTE: you can create a Maven project manually without using archetypes
NOTE: you can use any other system that works with Maven infrastructure, of course
- Fill a created pom.xml file with your information.
-
Add a <dependencyManagement/> section with dxa-dom
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.sdl.dxa</groupId>
<artifactId>dxa-bom</artifactId>
<version>${dxa-bom.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
-
Add a dependency on dxa-common-impl
<dependency> <groupId>com.sdl.dxa</groupId> <artifactId>dxa-common-impl</artifactId> </dependency>
-
Extend a AbstractInitializer class. This is a class to register your views and models.
Set all necessary annotations on it like in the code below.
// you can do multiple registration at once
@RegisteredViewModels({
@RegisteredViewModel(viewName = "MySecondView", model = MySecondModel.class),
@RegisteredViewModel(viewName = "MySecondView", model = MyAlternativeSecondModel.class),
@RegisteredViewModel(model = MyModelWithoutView.class)
})
// or use a single registration annotation if you have just 1 view
@RegisteredViewModel(viewName = "MyView", model = MyModel.class)
// @ModuleInfo is not mandatory but will give you better experience when debugging
@ModuleInfo(name = "My module", areaName = "MyModule", description = "My module implements my feature")
// you have to declare this as a Spring bean
@Component
public class MyModuleInitializer extends AbstractInitializer {
@Override
public String getAreaName() {
return "MyModule"; // this is a name of folder where you store your views
}
}
-
Now initialize your Spring context for the module.
@Configuration
@ComponentScan("my.package.mymodule")
public class SpringContext {
}
- Move your views to src/main/resources/META-INF/resources/WEB-INF/Views/…
- Move your models and classes with business logic to src/main/java
- Add the module to dependencies of your web application.
- Register your module Spring Context in your application.
- Now you have a module.
Now I have two projects and build them separately :(
Indeed, this is less convenient.
Three of million ways to solve it are:
-
Create a parent Maven project and declare your webapp and module as subprojects.
http://books.sonatype.com/mvnex-book/reference/multimodule.html
-
Create a cmd/shell script that will build your projects
call mvn clean install -f mymodule/pom.xml call mvn clean install -f mywebapp/pom.xml
-
In DXA we use a dxa-builder (starting from 1.6.0) which is publicly available. This requires you to create a gradle project without sources. For an example you can take a look at DXA project. https://github.com/sdl/dxa-web-application-java/blob/master/build.gradle
Translate