diff --git a/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionCreateDto.java b/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionCreateDto.java
index 9c1869f41c262775176ccb12d7006fcc86677ed1..738a9031739586351ba52b993c7522e0dbcb226d 100644
--- a/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionCreateDto.java
+++ b/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionCreateDto.java
@@ -1,5 +1,7 @@
 package org.fuseri.model.dto.exercise;
 
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -8,7 +10,13 @@ import java.util.List;
 @AllArgsConstructor
 @Getter
 public class QuestionCreateDto {
+
+    @NotBlank
     private String text;
+
+    @NotBlank
     private String exerciseId;
+
+    @Valid
     private List<AnswerInQuestionCreateDto> answers;
 }
diff --git a/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionDto.java b/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionDto.java
index 219439b894b925095afcbd5dabcfd02fe192ed4a..6aa390931227ecb391227689ed1451c5f226aa7e 100644
--- a/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionDto.java
+++ b/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionDto.java
@@ -1,5 +1,7 @@
 package org.fuseri.model.dto.exercise;
 
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Getter;
 import lombok.Setter;
 import org.fuseri.model.dto.common.DomainObjectDto;
@@ -9,7 +11,13 @@ import java.util.List;
 @Getter
 @Setter
 public class QuestionDto extends DomainObjectDto {
+
+    @NotBlank
     private String text;
+
+    @NotBlank
     private String exerciseId;
+
+    @Valid
     private List<AnswerDto> answers;
 }
diff --git a/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionUpdateDto.java b/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionUpdateDto.java
index 80514c32d0f42b036e8fe8793cf53a0a539e6ff6..2efa520493c718e108a180fabae12a4887913cab 100644
--- a/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionUpdateDto.java
+++ b/application/model/src/main/java/org/fuseri/model/dto/exercise/QuestionUpdateDto.java
@@ -1,11 +1,16 @@
 package org.fuseri.model.dto.exercise;
 
+import jakarta.validation.constraints.NotBlank;
 import lombok.Builder;
 import lombok.Getter;
 
 @Getter
 @Builder
 public class QuestionUpdateDto {
+
+    @NotBlank
     private String text;
+
+    @NotBlank
     private String exerciseId;
 }
diff --git a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java
index f4628a128f39649db4dbdaf9061afd366b9caa4f..bd217cc1c00f36d02b1b074b6e9028c20e291220 100644
--- a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java
+++ b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java
@@ -1,6 +1,9 @@
 package org.fuseri.moduleexercise.question;
 
 import jakarta.persistence.EntityNotFoundException;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.PositiveOrZero;
 import org.fuseri.model.dto.common.Result;
 import org.fuseri.model.dto.exercise.QuestionCreateDto;
 import org.fuseri.model.dto.exercise.QuestionDto;
@@ -37,7 +40,7 @@ public class QuestionController {
      * @return a QuestionDto object representing the found question
      */
     @GetMapping("/{id}")
-    public QuestionDto find(@PathVariable String id) {
+    public QuestionDto find(@NotBlank @PathVariable String id) {
         return questionFacade.find(id);
     }
 
@@ -48,8 +51,9 @@ public class QuestionController {
      * @param page       the page number of the questions to retrieve
      * @return a Result object containing a list of QuestionDto objects and pagination information
      */
-    @GetMapping("/exercise/{exerciseId}")
-    public Result<QuestionDto> findByExerciseId(@PathVariable String exerciseId, @RequestParam int page) {
+    @GetMapping("/exercise/{exercise-id}")
+    public Result<QuestionDto> findByExerciseId(@NotBlank @PathVariable("exercise-id") String exerciseId,
+                                                @PositiveOrZero @RequestParam int page) {
         return questionFacade.findByExerciseId(exerciseId, page);
     }
 
@@ -61,7 +65,7 @@ public class QuestionController {
      * @throws ResponseStatusException if the exercise with exerciseId from QuestionCreateDto does not exist
      */
     @PostMapping
-    public QuestionDto addQuestion(@RequestBody QuestionCreateDto dto) {
+    public QuestionDto addQuestion(@Valid @RequestBody QuestionCreateDto dto) {
         try {
             return questionFacade.create(dto);
         } catch (EntityNotFoundException e) {
@@ -78,7 +82,7 @@ public class QuestionController {
      * @throws ResponseStatusException if the question with id doesn't exist or its exercise doesn't exist
      */
     @PutMapping("/{id}")
-    public QuestionDto updateQuestion(@PathVariable String id, @RequestBody QuestionUpdateDto dto) {
+    public QuestionDto updateQuestion(@NotBlank @PathVariable String id, @Valid @RequestBody QuestionUpdateDto dto) {
         try {
             return questionFacade.update(id, dto);
         } catch (IllegalArgumentException e) {
@@ -94,7 +98,7 @@ public class QuestionController {
      * @param id of question to delete
      */
     @DeleteMapping("/{id}")
-    public void deleteQuestion(@PathVariable String id) {
+    public void deleteQuestion(@NotBlank @PathVariable String id) {
         questionFacade.delete(id);
     }
 }
\ No newline at end of file