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.
What input sanitization problem does every Java developer face?
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
How does Sanitizer-Lib solve input sanitization with annotations?
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.
What key features does Sanitizer-Lib offer?
๐ 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
}How does Sanitizer-Lib work in a real e-commerce application?
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);
}
}How do you create custom sanitizers for domain-specific 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"
}How does Sanitizer-Lib help with PCI compliance and sensitive data?
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 did I build Sanitizer-Lib?
As a Java developer, I was frustrated with:
- Repetitive Code - Writing the same sanitization logic everywhere
- Inconsistency - Different sanitization rules across the codebase
- Maintenance - Updating sanitization logic in multiple places
- 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! โญ
For related reading, see the OWASP Input Validation Cheat Sheet, the Jackson Custom Deserializers documentation, and the JPA Entity Lifecycle Events reference.
Keep Reading
- Sanitizer-Lib is Now Live on Maven Central โ The library is now on Maven Central with signed artifacts and zero extra repository config needed.
- 10 Essential Java Libraries Beyond Lombok โ More libraries that eliminate boilerplate and make your Java code cleaner.
Happy coding! โโจ
