Back to Blog
Sanitizer-Lib: The Java Library That Eliminates Input Sanitization Boilerplate Forever
Java Libraries

Sanitizer-Lib: The Java Library That Eliminates Input Sanitization Boilerplate Forever

Meet Sanitizer-Lib - a powerful Java library that automatically sanitizes your data with simple annotations. Zero configuration, Spring Boot ready, and enterprise-grade security for modern Java applications.

31 viewsJuly 1, 20256 min readRabi
javaspring-bootlibrarydata-sanitizationmaven-centralopen-sourceinput-validation

Ever tired of writing the same input sanitization code over and over again? Scattered trim(), toLowerCase(), and validation logic across your controllers, services, and entities?

I was too. That's why I created Sanitizer-Lib - a simple, powerful Java library that eliminates sanitization boilerplate with declarative annotations.

The Problem Every Java Developer Faces

We've all written code like this:

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody CreateUserRequest request) {
    // Manual sanitization everywhere ๐Ÿ˜ค
    String email = request.getEmail();
    if (email != null) {
        email = email.trim().toLowerCase();
    }
 
    String firstName = request.getFirstName();
    if (firstName != null) {
        firstName = firstName.trim();
        firstName = Character.toUpperCase(firstName.charAt(0)) +
                   firstName.substring(1).toLowerCase();
    }
 
    // ... more boilerplate code
    User user = new User(email, firstName);
    return ResponseEntity.ok(userService.save(user));
}

Problems with this approach:

  • ๐Ÿ”„ Repetitive boilerplate code
  • ๐Ÿ› Easy to forget sanitization in some places
  • ๐Ÿงช Hard to test consistently
  • ๐Ÿ“ˆ Maintenance nightmare as the app grows

The Solution: Sanitizer-Lib

With Sanitizer-Lib, the same code becomes:

public class CreateUserRequest {
    @Sanitize(using = {TrimSanitizer.class, LowerCaseSanitizer.class})
    private String email;
 
    @Sanitize(using = {TrimSanitizer.class, TitleCaseSanitizer.class})
    private String firstName;
 
    // Getters and setters
}
 
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody CreateUserRequest request) {
    // Data is automatically sanitized! โœจ
    User user = new User(request.getEmail(), request.getFirstName());
    return ResponseEntity.ok(userService.save(user));
}

Clean. Simple. Automatic.

Key Features That Make It Awesome

๐Ÿš€ Zero Configuration Setup

Add the dependency and you're ready to go. Spring Boot auto-configuration handles everything:

<dependency>
    <groupId>io.github.rabinarayanpatra.sanitizer</groupId>
    <artifactId>sanitizer-spring</artifactId>
    <version>1.0.15</version>
</dependency>

๐ŸŽฏ Built-in Sanitizers for Common Use Cases

  • TrimSanitizer - Removes leading/trailing whitespace
  • LowerCaseSanitizer - Converts to lowercase (perfect for emails)
  • TitleCaseSanitizer - Proper title case formatting
  • CreditCardMaskSanitizer - Masks card numbers for security

๐Ÿ”— Seamless Spring Boot Integration

Works automatically with Jackson during JSON deserialization:

// POST /api/users with JSON: {"email": "  JOHN@EXAMPLE.COM  "}
public class UserDto {
    @Sanitize(using = {TrimSanitizer.class, LowerCaseSanitizer.class})
    private String email; // Becomes: "john@example.com"
}

๐Ÿ—„๏ธ JPA Entity Protection

Sanitize data before it hits your database:

@Entity
@EntityListeners(SanitizationEntityListener.class)
public class User {
    @Sanitize(using = {TrimSanitizer.class, LowerCaseSanitizer.class})
    private String email;
 
    @Sanitize(using = CreditCardMaskSanitizer.class)
    private String cardNumber; // Automatically masked before save
}

Real-World Example: E-commerce Product

Here's how Sanitizer-Lib works in a real application:

public class ProductRequest {
    @Sanitize(using = {TrimSanitizer.class, TitleCaseSanitizer.class})
    private String name;        // "  apple iphone  " โ†’ "Apple Iphone"
 
    @Sanitize(using = {TrimSanitizer.class, LowerCaseSanitizer.class})
    private String category;    // "  ELECTRONICS  " โ†’ "electronics"
 
    @Sanitize(using = TrimSanitizer.class)
    private String description; // Preserves case, removes whitespace
}
 
@RestController
public class ProductController {
 
    @PostMapping("/products")
    public Product createProduct(@RequestBody ProductRequest request) {
        // All fields are automatically sanitized during JSON parsing!
        return productService.create(request);
    }
}

Custom Sanitizers for Your Business Logic

Need domain-specific sanitization? Create custom sanitizers easily:

@Component
public class PhoneNumberSanitizer implements FieldSanitizer<String> {
 
    @Override
    public String sanitize(String input) {
        if (input == null) return null;
 
        // Remove all non-digits
        String digits = input.replaceAll("[^0-9]", "");
 
        // Format US phone numbers
        if (digits.length() == 10) {
            return String.format("(%s) %s-%s",
                digits.substring(0, 3),
                digits.substring(3, 6),
                digits.substring(6));
        }
 
        return digits;
    }
}
 
// Usage
public class ContactDto {
    @Sanitize(using = PhoneNumberSanitizer.class)
    private String phone; // "555-123-4567" โ†’ "(555) 123-4567"
}

Security First: PCI Compliance Made Easy

Handle sensitive data safely with built-in security sanitizers:

@Entity
@EntityListeners(SanitizationEntityListener.class)
public class Payment {
 
    @Sanitize(using = CreditCardMaskSanitizer.class)
    private String cardNumber; // "1234567890123456" โ†’ "**** **** **** 3456"
 
    @Sanitize(using = {TrimSanitizer.class, TitleCaseSanitizer.class})
    private String cardholderName;
}

Why I Built This Library

As a Java developer, I was frustrated with:

  1. Repetitive Code - Writing the same sanitization logic everywhere
  2. Inconsistency - Different sanitization rules across the codebase
  3. Maintenance - Updating sanitization logic in multiple places
  4. Testing - Ensuring sanitization works correctly everywhere

Sanitizer-Lib solves all these problems with a clean, declarative approach that's:

  • โœ… Consistent - Same sanitization rules everywhere
  • โœ… Maintainable - Change logic in one place
  • โœ… Testable - Easy to unit test sanitizers
  • โœ… Performant - Minimal overhead
  • โœ… Flexible - Easy to extend with custom sanitizers

Architecture: Clean and Modular

Sanitizer-Lib follows a modular design:

sanitizer-lib/
โ”œโ”€โ”€ sanitizer-core/    โ† Core API and built-in sanitizers
โ”œโ”€โ”€ sanitizer-spring/  โ† Spring Boot integration
โ””โ”€โ”€ sanitizer-jpa/     โ† JPA entity lifecycle hooks

This allows you to use only what you need:

  • Just core? Use sanitizer-core
  • Spring Boot app? Add sanitizer-spring
  • Need JPA integration? Include sanitizer-jpa

Getting Started in 2 Minutes

1. Add the Dependency

<dependency>
    <groupId>io.github.rabinarayanpatra.sanitizer</groupId>
    <artifactId>sanitizer-spring</artifactId>
    <version>1.0.15</version>
</dependency>

2. Annotate Your Fields

public class UserRegistrationDto {
    @Sanitize(using = {TrimSanitizer.class, LowerCaseSanitizer.class})
    private String email;
 
    @Sanitize(using = {TrimSanitizer.class, TitleCaseSanitizer.class})
    private String fullName;
}

3. That's It!

Your data is automatically sanitized during JSON deserialization. No configuration needed.

Performance and Production Ready

Sanitizer-Lib is built for production use:

  • ๐Ÿš€ Fast - Minimal overhead, efficient processing
  • ๐Ÿ”’ Secure - Built-in sanitizers for sensitive data
  • ๐Ÿ“Š Observable - Integrates with Spring Boot Actuator
  • ๐Ÿงช Well-Tested - Comprehensive test suite
  • ๐Ÿ“š Documented - Clear documentation and examples

Contributing and Roadmap

Sanitizer-Lib is open source and welcomes contributions!

Current features:

  • โœ… Spring Boot integration
  • โœ… JPA entity lifecycle hooks
  • โœ… Built-in sanitizers
  • โœ… Custom sanitizer support
  • โœ… Maven Central deployment

Planned features:

  • ๐Ÿ”„ Validation integration
  • ๐ŸŽฏ More built-in sanitizers
  • ๐Ÿ“ˆ Performance optimizations
  • ๐Ÿ”ง Configuration properties

Try It Today!

Ready to eliminate sanitization boilerplate from your Java applications?

Quick Start:

# Add to your Spring Boot project
<dependency>
    <groupId>io.github.rabinarayanpatra.sanitizer</groupId>
    <artifactId>sanitizer-spring</artifactId>
    <version>1.0.15</version>
</dependency>

Resources:

  • ๐Ÿ“š GitHub: github.com/rabinarayanpatra/sanitizer-lib
  • ๐Ÿ“ฆ Maven Central: Available now
  • ๐Ÿ“– Documentation: Comprehensive examples in the README
  • ๐Ÿ› Issues: Report bugs and request features on GitHub

Conclusion

Sanitizer-Lib transforms tedious, error-prone sanitization code into clean, declarative annotations. With zero configuration and powerful Spring Boot integration, it's the missing piece your Java applications need.

Stop writing sanitization boilerplate. Start using Sanitizer-Lib.


What sanitization challenges are you facing in your Java projects? Try Sanitizer-Lib and let me know how it works for you! โญ

Happy coding! โ˜•โœจ

Liked the blog?

Share it with your friends and help them learn something new!