Quick Start Guide¶
Get up and running with MetaObjects in just a few minutes. This guide will walk you through creating your first metadata definition, loading it, and using it in your application.
Prerequisites¶
- Java 17 LTS or higher
- Maven 3.9+ (or Gradle with equivalent configuration)
- Basic knowledge of Java development
Step 1: Add Dependencies¶
Choose the appropriate dependency based on your project type:
<dependencies>
<dependency>
<groupId>com.metaobjects</groupId>
<artifactId>metaobjects-codegen-mustache</artifactId>
<version>6.2.5-SNAPSHOT</version>
</dependency>
</dependencies>
<plugins>
<plugin>
<groupId>com.metaobjects</groupId>
<artifactId>metaobjects-maven-plugin</artifactId>
<version>6.2.5-SNAPSHOT</version>
<executions>
<execution>
<goals><goal>generate</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
Step 2: Create Your First Metadata¶
Create a JSON metadata file that defines a simple User object:
{
"metadata": {
"package": "com_example_model",
"children": [
{
"object": {
"name": "User",
"type": "pojo",
"@dbTable": "users",
"children": [
{
"field": {
"name": "id",
"type": "long",
"@required": true,
"@dbColumn": "user_id"
}
},
{
"field": {
"name": "email",
"type": "string",
"@required": true,
"@maxLength": 255,
"@pattern": "^[\\w._%+-]+@[\\w.-]+\\.[A-Za-z]{2,}$",
"@dbColumn": "email_address"
}
},
{
"field": {
"name": "firstName",
"type": "string",
"@maxLength": 100,
"@dbColumn": "first_name"
}
},
{
"field": {
"name": "lastName",
"type": "string",
"@maxLength": 100,
"@dbColumn": "last_name"
}
},
{
"field": {
"name": "createdAt",
"type": "date",
"@dbColumn": "created_at"
}
}
]
}
}
]
}
}
Inline Attributes
Notice the @ prefix on attributes like @required, @maxLength, etc. This is MetaObjects' inline attribute syntax that makes metadata more readable and concise.
Step 3: Load and Use Metadata¶
Create a simple Java application that loads and uses the metadata:
package com.example;
import com.metaobjects.loader.simple.SimpleLoader;
import com.metaobjects.object.MetaObject;
import com.metaobjects.field.MetaField;
import com.metaobjects.attr.MetaAttribute;
import java.net.URI;
import java.util.Arrays;
public class QuickStartExample {
public static void main(String[] args) throws Exception {
// 1. Create and initialize the metadata loader
SimpleLoader loader = new SimpleLoader("user-metadata");
loader.setSourceURIs(Arrays.asList(
URI.create("classpath:metadata/user-metadata.json")
));
loader.init();
// 2. Get the User metadata
MetaObject userMeta = loader.getMetaObjectByName("User");
System.out.println("Loaded metadata for: " + userMeta.getName());
// 3. Explore the metadata structure
System.out.println("Database table: " +
userMeta.getMetaAttr("dbTable").getValueAsString());
// 4. Examine fields
System.out.println("\nFields:");
for (MetaField field : userMeta.getChildren(MetaField.class)) {
System.out.printf(" %s (%s)",
field.getName(),
field.getSubTypeName()
);
// Check for database column mapping
if (field.hasMetaAttr("dbColumn")) {
System.out.printf(" -> %s",
field.getMetaAttr("dbColumn").getValueAsString()
);
}
// Check for validation attributes
if (field.hasMetaAttr("required")) {
System.out.print(" [REQUIRED]");
}
if (field.hasMetaAttr("maxLength")) {
System.out.printf(" [MAX:%s]",
field.getMetaAttr("maxLength").getValueAsString()
);
}
System.out.println();
}
// 5. Access specific field metadata
MetaField emailField = userMeta.getMetaField("email");
if (emailField.hasMetaAttr("pattern")) {
System.out.println("\nEmail validation pattern: " +
emailField.getMetaAttr("pattern").getValueAsString());
}
}
}
package com.example;
import com.metaobjects.object.MetaObject;
import com.metaobjects.field.MetaField;
import com.metaobjects.spring.MetaDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private MetaDataService metaDataService;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// MetaDataService automatically discovers and loads metadata
MetaObject userMeta = metaDataService.getMetaObjectByName("User")
.orElseThrow(() -> new RuntimeException("User metadata not found"));
System.out.println("Loaded metadata for: " + userMeta.getName());
// Use the metadata same as plain Java example above
System.out.println("Database table: " +
userMeta.getMetaAttr("dbTable").getValueAsString());
// ... rest of exploration code
}
}
Step 4: Run the Example¶
Run your application and you should see output like:
Loaded metadata for: User
Database table: users
Fields:
id (long) -> user_id [REQUIRED]
email (string) -> email_address [REQUIRED] [MAX:255]
firstName (string) -> first_name [MAX:100]
lastName (string) -> last_name [MAX:100]
createdAt (date) -> created_at
Email validation pattern: ^[\w._%+-]+@[\w.-]+\.[A-Za-z]{2,}$
What Just Happened?¶
Congratulations! You've just:
- Defined metadata for a User object in JSON format
- Loaded the metadata using MetaObjects' SimpleLoader
- Accessed metadata programmatically to inspect object structure
- Used inline attributes for validation and database mapping
- Explored the metadata to understand field types and constraints
Key Concepts Demonstrated¶
Metadata Definition¶
- JSON format with hierarchical structure
- Inline attributes using
@prefix for concise syntax - Type system with built-in field types (string, long, date)
Loader Pattern¶
- SimpleLoader for JSON metadata files
- URI-based source specification
- Classpath resource loading
Runtime Access¶
- Type-safe metadata exploration
- Attribute access for validation and mapping rules
- Field iteration and inspection
Next Steps¶
Now that you have the basics working, explore these areas:
-
Core Concepts
Understand the fundamental architecture and patterns
-
Metadata Guide
Learn about the complete metadata system
-
Code Generation
Generate Java classes from your metadata
-
Examples
Explore more comprehensive examples
Common Issues¶
ClassPath Resource Not Found¶
If you get FileNotFoundException, ensure your metadata file is in the correct location:
JSON Parsing Errors¶
Validate your JSON syntax and ensure:
- Proper escaping of regex patterns in @pattern attributes
- Correct nesting of metadata → children → object/field structures
Missing Dependencies¶
If you get ClassNotFoundException, verify you have the correct MetaObjects dependencies for your use case.
Ready to dive deeper? Continue with Core Concepts to understand the architecture behind what you just built!