2

I m still learning JHipster, So today I though about making somme validation exerices by my self, and to try to send meaningfull error messages to my frontend

Here is what I tried

In my controller I have the following :

/**
 * POST  /lessons : Create a new lesson of 45 min.
 * 
 * if lesson is of type creno or circulation the car is mandatory
 *
 * @param lessonDTO the lessonDTO to create
 * @return the ResponseEntity with status 201 (Created) and with body the new lessonDTO, or with status 400 (Bad Request) if the lesson has already an ID
 * @throws URISyntaxException if the Location URI syntax is incorrect
 */
@PostMapping("/lessons")
public ResponseEntity<LessonDTO> createLesson(@Valid @RequestBody LessonDTO lessonDTO) throws URISyntaxException {
    log.debug("REST request to save Lesson : {}", lessonDTO);
    if (lessonDTO.getId() != null) {
        throw new BadRequestAlertException("A new lesson cannot already have an ID", ENTITY_NAME, "idexists");
    }
    if(!lessonService.checkLessonTime(lessonDTO)){
        return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(ENTITY_NAME,"EK_L_C01", "erreur de requete dupliquer")).build();
    }
    LessonDTO result = lessonService.save(lessonDTO);
    return ResponseEntity.created(new URI("/api/lessons/" + result.getId()))
        .headers(HeaderUtil.createEntityCreationAlert(ENTITY_NAME, result.getId().toString()))
        .body(result);
}

as you see if the check lesson time fails I have to send a bad request response with failure code EK_L_C01 then my next step ws to make a little change in the front end where I got to make this

save() {
    this.isSaving = true;
    this.lesson.dateLesson = this.dateLesson != null ? moment(this.dateLesson, DATE_TIME_FORMAT) : null;
    if (this.lesson.id !== undefined) {
        this.subscribeToSaveResponse(this.lessonService.update(this.lesson));
    } else {
        this.subscribeToSaveResponse(this.lessonService.create(this.lesson));
    }
}

protected subscribeToSaveResponse(result: Observable<HttpResponse<ILesson>>) {
    result.subscribe((res: HttpResponse<ILesson>) => this.onSaveSuccess(), (res: HttpErrorResponse) => this.onSaveError(res.message));
}

protected onSaveSuccess() {
    this.isSaving = false;
    this.previousState();
}

protected onSaveError(errorMessage: string) {
    this.isSaving = false;
    this.onError(errorMessage);
}

protected onError(errorMessage: string) {
    this.jhiAlertService.error(errorMessage, null, null);
}

then I added the translation of the code in my global.json as below

"error": {
        "internalServerError": "Erreur interne du serveur",
        "server.not.reachable": "Serveur inaccessible",
        "url.not.found": "Non trouvé",
        "NotNull": "Le champ {{fieldName}} ne peut pas être vide !",
        "Size": "Le champ {{fieldName}} ne respecte pas les critères minimum et maximum !",
        "userexists": "Login déjà utilisé !",
        "emailexists": "Email déjà utilisé !",
        "idexists": "Une nouvelle entité {{entityName}} ne peut pas avoir d'ID !",
        "idnull": "Invalid ID",
        "EK_L_C01": "Impossible de reserver une lesson : nombre maximal de lesson attein {{dateLesson}} "
    },

I have my message displayed but there is no date value.

As you see I want to mention the date used as error message variable but I dont know how, so How can I add this date value to my error message ?

2 Answers2

3

Hi After a full day of code swimming I did found that Jhipster have already made a error handling mechanisme in the web/rest/errors package it is full of Throwable that seems to be handy, for my case it was CustomParameterizedException

What I did was simple

First My controller create lesson became :

@PostMapping("/lessons")
public ResponseEntity<LessonDTO> createLesson(@Valid @RequestBody LessonDTO lessonDTO) throws URISyntaxException {
    log.debug("REST request to save Lesson : {}", lessonDTO);
    if (lessonDTO.getId() != null) {
        throw new BadRequestAlertException("A new lesson cannot already have an ID", ENTITY_NAME, "idexists");
    }
    if(!lessonService.checkLessonTime(lessonDTO)){
        throw new CustomParameterizedException("error.EK_L_C01", lessonDTO.getDateLesson().toString());
    }
    LessonDTO result = lessonService.save(lessonDTO);
    return ResponseEntity.created(new URI("/api/lessons/" + result.getId()))
        .headers(HeaderUtil.createEntityCreationAlert(ENTITY_NAME, result.getId().toString()))
        .body(result);
}

then my global.json was updated as follow

"error": {
        "internalServerError": "Erreur interne du serveur",
        "server.not.reachable": "Serveur inaccessible",
        "url.not.found": "Non trouvé",
        "NotNull": "Le champ {{fieldName}} ne peut pas être vide !",
        "Size": "Le champ {{fieldName}} ne respecte pas les critères minimum et maximum !",
        "userexists": "Login déjà utilisé !",
        "emailexists": "Email déjà utilisé !",
        "idexists": "Une nouvelle entité {{entityName}} ne peut pas avoir d'ID !",
        "idnull": "Invalid ID",
        "EK_L_C01": "Impossible de reserver une lesson : nombre maximal de lesson attein pour la date {{param0}} "
    },

This way when the checkLessonTime fails I m getting the desired error message with parameters

Thanks for the interest, wish this help others new to jhipster.

For more details read the class code of CustomParameterizedException.

crowne
  • 8,456
  • 3
  • 35
  • 50
  • 1
    it looks like CustomParameterizedException is no longer generated my jhipster version is 7.3.1 – crowne Nov 19 '21 at 13:54
3

This has completely changed since Jhipster 6.6, CustomParameterizedException is deprecated in favor of Zalando's Problem Library. You can see jhipster using it in the ExceptionTranslator.

Here is how it works now

    throw Problem.builder()
        .withStatus(Status.BAD_REQUEST)
        .withTitle("Out of stock")
        .with("message","myjhipsterApp.myentity.error.itBeAllGone")
        .with("param1", "hello there").with("param2", "more hello")
        .build();

Custom error messages are translated and are in your myentity.json, not typically in global.json.

for more info on how to handle Spring MVC REST errors, JHipster uses Zalando’s Problem Spring Web library, in order to provide rich, JSON-based error messages.

Lance
  • 113
  • 7