I have Spring microservice project:
This is the project structure:
- Project
- src
- main
- java
-- com.example
-- Microservice1
-- Microservice2
-controller
-service
-repository
-entity
-dto
-mapper
-- Microservice3
- MainClass.java
- resources
- application.yml
- build.gradle
I want to disable Microservice 2 based on a condition like true or false:
- The table should not be created in the database for Microservice 2
- Beans in controller, service, repository should not be created
- if the condition is true all the beans of Microservice 2 and table in DB should be created, if false all the beans of Microservice 2 and table in DB should not be created.
I have tried using @ConditionalOnExpression
for the controller, service, repository and the beans are not created
//UserController
@RestController
@RequestMapping("/api/users")
@ConditionalOnExpression("${user.enabled}")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User createdUser = userService.createUser(user);
return new ResponseEntity<>(createdUser, HttpStatus.CREATED);
}
}
The above approach is not working for the entity class, and the table is created in the database.
Below is the entity class:
//User Entity
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "users_table")
@ConditionalOnExpression("${user.enabled}")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
private String password;
private String role;
}
Below is my application.properties file
spring.jpa.defer-datasource-initialization=true
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.sql.init.mode=always
# H2 DATABASE
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=sa
springdoc.swagger-ui.enabled=true
order.enabled=false
server.port=9091
The @ConditionalOnExpression
(and an alternative @Profile
) annotations work only with beans. Entity class is not a bean. That’s why the table will be created at startup.
Solution 1
Don’t let JPA create the database tables. Use SQL script instead. You can have different scripts for different profiles.
Solution 2
Use a proper microservice architecture and put each microservice to a separate project or module.