Shared Libraries contain code and utilities shared across all backend services, including domain building blocks, exception handling, JWT utilities, and more.
backend/shared/
├── domain-common/ # DDD building blocks, exception handling
│ └── src/main/java/com/datamate/common/
│ ├── infrastructure/exception/ # BusinessException, ErrorCode
│ ├── setting/ # System params, model configs
│ └── domain/ # Base entities, repositories
└── security-common/ # JWT utilities, auth helpers
└── src/main/java/com/datamate/security/
Unified business exception handling mechanism:
// Throw business exception
throw BusinessException.of(ErrorCode.DATASET_NOT_FOUND)
.withDetail("dataset_id", datasetId);
// Exception with context
throw BusinessException.of(ErrorCode.VALIDATION_FAILED)
.withDetail("field", "email")
.withDetail("reason", "Invalid format");Error code enumeration interface:
public interface ErrorCode {
String getCode();
String getMessage();
HttpStatus getHttpStatus();
}
// Example
public enum CommonErrorCode implements ErrorCode {
SUCCESS("0000", "Success", HttpStatus.OK),
DATABASE_NOT_FOUND("4001", "Database not found", HttpStatus.NOT_FOUND);
}Base class for all entities, including audit fields:
@Data
@EqualsAndHashCode(callSuper = true)
public class BaseEntity<T> implements Serializable {
@TableId(type = IdType.ASSIGN_ID)
private String id;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createdAt;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedAt;
@TableField(fill = FieldFill.INSERT)
private String createdBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updatedBy;
}JWT Token generation and validation:
// Generate Token
String token = JwtUtil.generateToken(userId, secret, expiration);
// Validate Token
Claims claims = JwtUtil.validateToken(token, secret);
String userId = claims.getSubject();<dependency>
<groupId>com.datamate</groupId>
<artifactId>domain-common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.datamate</groupId>
<artifactId>security-common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>@RestController
@RequiredArgsConstructor
public class DatasetController {
public ResponseEntity<DatasetResponse> getDataset(String id) {
Dataset dataset = datasetService.findById(id);
if (dataset == null) {
throw BusinessException.of(ErrorCode.DATASET_NOT_FOUND);
}
return ResponseEntity.ok(DatasetResponse.from(dataset));
}
}cd backend
mvn clean installShared libraries are automatically inherited by all backend services.