Bird
Raised Fist0
Spring Bootframework~20 mins

Service calling repository in Spring Boot - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Service Repository Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What is the output when the service calls the repository method?
Consider a Spring Boot service class calling a repository method that returns an Optional. What will be the output if the repository returns Optional.empty() and the service calls getUserNameById() which returns the user's name or 'Unknown' if not found?
Spring Boot
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public String getUserNameById(Long id) {
        return userRepository.findById(id)
            .map(User::getName)
            .orElse("Unknown");
    }
}

public interface UserRepository {
    Optional<User> findById(Long id);
}

public record User(Long id, String name) {}
A"Unknown"
Bnull
CThrows NoSuchElementException
D"" (empty string)
Attempts:
2 left
💡 Hint
Think about how Optional.orElse() works when the Optional is empty.
📝 Syntax
intermediate
2:00remaining
Which repository method signature is correct for Spring Data JPA?
You want to define a repository interface method to find a User by email. Which method signature is correct to let Spring Data JPA generate the query automatically?
Spring Boot
public interface UserRepository extends JpaRepository<User, Long> {
    // Choose the correct method signature
}
AOptional<User> findByEmail(String email);
BOptional<User> findUserByEmail(String email);
CUser findByEmail(String email);
DUser getUserByEmail(String email);
Attempts:
2 left
💡 Hint
Spring Data JPA supports Optional return types for nullable results.
🔧 Debug
advanced
2:00remaining
Why does the service fail to autowire the repository?
Given the service class below, why does Spring fail to inject the UserRepository bean?
Spring Boot
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService() {
        this.userRepository = null;
    }

    public String getUserName(Long id) {
        return userRepository.findById(id).map(User::getName).orElse("Unknown");
    }
}
ABecause the service field userRepository is private
BBecause the service class is missing @Component annotation
CBecause the service has no constructor with UserRepository parameter for Spring to inject
DBecause UserRepository is not annotated with @Repository
Attempts:
2 left
💡 Hint
Spring injects dependencies via constructor or field injection. Check the constructor.
state_output
advanced
2:00remaining
What is the state of the user list after service method call?
The service calls repository.saveAll() with a list of new users. What will be the size of the list returned by the service method?
Spring Boot
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> saveUsers(List<User> users) {
        return userRepository.saveAll(users);
    }
}

public interface UserRepository {
    List<User> saveAll(List<User> users);
}
AThe returned list is always empty
BThe returned list size equals the input list size
CThe returned list size is zero if any user is null
DThe returned list size is double the input list size
Attempts:
2 left
💡 Hint
saveAll returns the saved entities, usually matching the input size.
🧠 Conceptual
expert
3:00remaining
What happens if a transactional service method calls a repository and an exception occurs?
In a Spring Boot application, a service method annotated with @Transactional calls a repository save method. If a runtime exception is thrown after the save call but before the method ends, what is the state of the database?
Spring Boot
@Service
@Transactional
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void saveUserWithError(User user) {
        userRepository.save(user);
        if (true) {
            throw new RuntimeException("Error after save");
        }
    }
}
AThe transaction commits partially with warnings
BThe user is saved despite the exception
CThe database state is undefined and may be corrupted
DThe save is rolled back; no user is persisted
Attempts:
2 left
💡 Hint
Think about how @Transactional handles runtime exceptions and rollbacks.

Practice

(1/5)
1. What is the main role of a Service class in Spring Boot when it calls a Repository?
easy
A. To configure the database settings
B. To directly manage database connections
C. To replace the repository and perform SQL queries
D. To handle business logic and use the repository for data access

Solution

  1. Step 1: Understand the role of Service

    The Service layer contains business logic and does not directly access the database.
  2. Step 2: Understand the role of Repository

    The Repository handles data access and database operations.
  3. Final Answer:

    To handle business logic and use the repository for data access -> Option D
  4. Quick Check:

    Service handles logic, Repository handles data [OK]
Hint: Service = logic, Repository = data access [OK]
Common Mistakes:
  • Thinking Service manages database connections
  • Confusing Repository with Service responsibilities
  • Assuming Service runs SQL queries directly
2. Which is the correct way to inject a repository into a service class in Spring Boot?
easy
A. Use @Autowired on a constructor parameter
B. Create a new repository instance inside the service method
C. Use new keyword to instantiate repository in service constructor
D. Declare repository as a static variable in the service

Solution

  1. Step 1: Understand dependency injection in Spring Boot

    Spring Boot recommends constructor injection with @Autowired for better testability and immutability.
  2. Step 2: Check options for repository injection

    Creating new instances manually or static variables break Spring's management and are not recommended.
  3. Final Answer:

    Use @Autowired on a constructor parameter -> Option A
  4. Quick Check:

    Constructor injection with @Autowired [OK]
Hint: Use @Autowired constructor injection for repositories [OK]
Common Mistakes:
  • Manually creating repository instances
  • Using static variables for repository
  • Not using Spring's dependency injection
3. Given this service code snippet, what will getUserName(1) return if the repository finds a user with name "Alice"?
public class UserService {
  private final UserRepository userRepository;

  public UserService(UserRepository userRepository) {
    this.userRepository = userRepository;
  }

  public String getUserName(int id) {
    return userRepository.findById(id).map(User::getName).orElse("Unknown");
  }
}
medium
A. null
B. "Unknown"
C. "Alice"
D. Throws NullPointerException

Solution

  1. Step 1: Understand repository method behavior

    findById(id) returns an Optional containing the User if found.
  2. Step 2: Analyze service method logic

    The method maps the User to its name or returns "Unknown" if no user is found.
  3. Final Answer:

    "Alice" -> Option C
  4. Quick Check:

    User found returns name, else "Unknown" [OK]
Hint: Optional.map returns value or default [OK]
Common Mistakes:
  • Assuming null is returned instead of default
  • Expecting exception when user not found
  • Confusing Optional usage
4. What is wrong with this service code that calls a repository?
@Service
public class ProductService {
  private ProductRepository productRepository;

  public void saveProduct(Product product) {
    productRepository.save(product);
  }
}
medium
A. The save method does not exist in repositories
B. The repository is not injected, so it will cause a NullPointerException
C. The service class must be abstract
D. The Product parameter should be annotated with @Entity

Solution

  1. Step 1: Check repository injection

    The repository field is declared but not injected or initialized.
  2. Step 2: Understand consequence of missing injection

    Calling save on a null repository causes NullPointerException at runtime.
  3. Final Answer:

    The repository is not injected, so it will cause a NullPointerException -> Option B
  4. Quick Check:

    Missing injection causes null pointer error [OK]
Hint: Always inject repository before use [OK]
Common Mistakes:
  • Forgetting @Autowired or constructor injection
  • Assuming repository auto-initializes
  • Confusing entity annotation with parameter
5. You want to create a service method that returns all active users from the database. The repository has a method List<User> findByActiveTrue(). How should the service method call the repository and return the list?
hard
A. public List<User> getActiveUsers() { return userRepository.findByActiveTrue(); }
B. public List<User> getActiveUsers() { return userRepository.findAll(); }
C. public List<User> getActiveUsers() { return userRepository.findByActiveFalse(); }
D. public List<User> getActiveUsers() { return null; }

Solution

  1. Step 1: Identify repository method for active users

    The repository method findByActiveTrue() returns users with active = true.
  2. Step 2: Use repository method in service

    The service should call this method and return its result directly.
  3. Final Answer:

    public List<User> getActiveUsers() { return userRepository.findByActiveTrue(); } -> Option A
  4. Quick Check:

    Call matching repository method for active users [OK]
Hint: Call repository method matching your filter [OK]
Common Mistakes:
  • Calling findAll() returns all users, not filtered
  • Using findByActiveFalse() returns inactive users
  • Returning null instead of data