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.

July 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.22</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.22</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! โ˜•โœจ

Join the Community

Get the latest articles on system design, frontend & backend development, and emerging tech trends delivered straight to your inbox.

No spam. Unsubscribe at any time.

Liked the blog?

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