Skip to main content

Configuration

Spring Boot Result Starter requires manual configuration to enable advanced features.

Basic Setup

The core Result class and ResponseUtils work without any configuration:

// Works out of the box
Result<User> result = Result.success(user);
return ResponseUtils.asResponse(result);

Enable Transaction Rollback

To use @RollbackOnFailure, configure the aspect:

@Configuration
@EnableAspectJAutoProxy
public class ResultConfig {

@Bean
public TransactionRollbackAspect transactionRollbackAspect() {
return new TransactionRollbackAspect();
}
}

Usage:

@Service
@Transactional
public class UserService {

@RollbackOnFailure
public Result<User> createUser(CreateUserRequest request) {
// Transaction rolls back if Result indicates failure
return Result.success(userRepository.save(user));
}
}

Enable Event Publishing

To use @PublishEvent, configure the aspect:

@Configuration
@EnableAspectJAutoProxy
public class ResultConfig {

@Bean
public EventPublishingAspect eventPublishingAspect(ApplicationEventPublisher publisher) {
return new EventPublishingAspect(publisher);
}
}

Usage:

@PublishEvent(on = PublishEvent.EventType.SUCCESS)
public Result<User> createUser(CreateUserRequest request) {
// Event published on success
return Result.success(userRepository.save(user));
}

Enable Async Support

For async operations, enable async processing with virtual threads (Java 21+):

@Configuration
@EnableAsync
public class AsyncConfig {

@Bean
public TaskExecutor taskExecutor() {
return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
}
}

For Java 17/19:

@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("result-async-");
executor.initialize();
return executor;
}

Complete Configuration

Enable all features:

@Configuration
@EnableAspectJAutoProxy
@EnableAsync
@EnableTransactionManagement
public class ResultConfig {

@Bean
public TransactionRollbackAspect transactionRollbackAspect() {
return new TransactionRollbackAspect();
}

@Bean
public EventPublishingAspect eventPublishingAspect(ApplicationEventPublisher publisher) {
return new EventPublishingAspect(publisher);
}

@Bean
public TaskExecutor taskExecutor() {
return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
}
}

Feature Matrix

FeatureRequired ConfigurationDependencies
Result<T>NoneCore library
ResponseUtilsNoneCore library
@RollbackOnFailureTransactionRollbackAspect@EnableAspectJAutoProxy, @EnableTransactionManagement
@PublishEventEventPublishingAspect@EnableAspectJAutoProxy
Result.async()NoneCore library
@Async methods@EnableAsyncSpring Boot

Minimal Configuration

If you only need basic Result pattern without aspects:

// No configuration needed
@RestController
public class UserController {

@GetMapping("/users/{id}")
public ResponseEntity<?> getUser(@PathVariable Long id) {
Result<User> result = userService.findById(id);
return ResponseUtils.asResponse(result);
}
}