11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je sollicite votre aide pour une regex qui me permettra de récupérer une sous-chaîne de caractères dans une chaîne de caractères.

Ma réponse API est la suivante:

"Validation failed for classes [com.portfolio.todo.entity.Todo] during persist time for groups [jakarta.validation.groups.Default, ]\nList of constraint violations:[\n\tConstraintViolationImpl{interpolatedMessage='A description must be provided', propertyPath=description, rootBeanClass=class com.portfolio.todo.entity.Todo, messageTemplate='A description must be provided'}\n\tConstraintViolationImpl{interpolatedMessage='A title must be provided', propertyPath=title, rootBeanClass=class com.portfolio.todo.entity.Todo, messageTemplate='A title must be provided'}\n]"

Le résultat attendu:
['A description must be provided', 'A title must be provided']

Le but est de récupérer uniquement les messages d'erreurs pour les retourner dans la réponse HTTP. Est-ce que c'est possible ?

Merci Smiley smile

PS. Je suis débutant sur Java (Spring Boot). Si quelqu'un connait une méthode Java spécifique pour retourner uniquement les messages d'erreurs, je suis preneur. Je n'ai rien trouver de pertinent sur Stack Overflow.


 @NotEmpty(message = "A title must be provided")
    private String title;
 @NotEmpty(message = "A description must be provided")
    private String description;
Modérateur
Salut,

Je ne connais pas Java.
Tu récupères ce qu'il y a entre les simples quotes :

pattern = /messageTemplate='(.*)'/

Modifié par niuxe (21 May 2025 - 20:47)
Salut @niuxe,

Ta première suggestion était mieux parce qu'au moins je récupérais plusieurs occurrences.
Quand je teste ta nouvelle suggestion, je récupère trop de texte et qu'une seule occurence.
Je teste avec le site regex101.com
Modérateur
allan00958 a écrit :
Salut @niuxe,

Ta première suggestion était mieux parce qu'au moins je récupérais plusieurs occurrences.
Quand je teste ta nouvelle suggestion, je récupère trop de texte et qu'une seule occurence.
Je teste avec le site regex101.com


En effet, j'avais fait un script qui permet de scinder entre les accolades et finalement de récupérer ce que tu recherches. Ensuite, je me suis ravisé pensant qu'il y avait plus simple. Voici le script :

# importer module expression régumlière
import re 

# compile pattern
pattern_a = re.compile(r"\{([^{}]*)\}")
pattern_b = re.compile(r"messageTemplate='(.*)'")

# chaîne de caractères
msg = "Validation failed for classes [com.portfolio.todo.entity.Todo] during persist time for groups [jakarta.validation.groups.Default, ]\nList of constraint violations:[\n\tConstraintViolationImpl{interpolatedMessage='A description must be provided', propertyPath=description, rootBeanClass=class com.portfolio.todo.entity.Todo, messageTemplate='A description must be provided'}\n\tConstraintViolationImpl{interpolatedMessage='A title must be provided', propertyPath=title, rootBeanClass=class com.portfolio.todo.entity.Todo, messageTemplate='A title must be provided'}\n]"

# boucle pour récupérer le contenu entre les accolades
for row in pattern_a.findall(msg):
    print(pattern_b.findall(row)) # affiche le résultat

ça te retourne :

['A description must be provided']
['A title must be provided']

Modifié par niuxe (21 May 2025 - 23:21)
Merci !

Finalement, j'ai codé ceci, qui semble faire l'affaire:


public class FormatHTTPErrorsReponses {

public static List<String> formatResponse(String text) {
        List<String> errors = new ArrayList<>();
        Pattern pattern = Pattern.compile("(messageTemplate=')(.*?)(')", Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(text);

        while(matcher.find()) {
            errors.add(matcher.group(2));
        }
        return errors;
    }
}
Modérateur
Bien que je ne connaisse pas le Java, j'arrive un peu à le lire. Si je comprends bien, ton pattern est :

(messageTemplate=')(.*?)(')


Pourquoi captures-tu le simple guillemet ?
Modifié par niuxe (22 May 2025 - 13:21)
Les messages d'erreurs sont contenus dans des guillemets simples.

Contexte:
Je suis en plein apprentissage de Java, précisément la création d'API REST avec Spring Boot, Spring Data JPA et une base de données. Cette API sera consommée par un client, en l'occurence, par une application Angular. C'est une API CRUD pour gérer des todos. Je veux donc retourner des messages d'erreurs pertinents à l'utilisateur de l'API.

PS. Plus besoin de cette fonction. J'ai enfin compris/trouvé comment retourner une exception personnalisée en Java. Néanmoins, ça m'a permis de mettre le nez dans l'API Regex. Il y a tant de choses à apprendre Smiley lol
Modifié par allan00958 (22 May 2025 - 15:11)