[Spring MVC] Implémentez les paramètres dynamiques inclus dans l'URL sans utiliser Facultatif (~ Java7)

Je construis actuellement un système Web basé sur Java 7. Il y a plusieurs raisons pour lesquelles je n'utilise pas Java 8 En échange, pour cette raison, le problème était que l'option facultative ne pouvait pas être utilisée.

Implémenter en utilisant facultatif (pour Java 8 ou version ultérieure)

Facultatif est "Je ne sais pas si l'argument aura une valeur, mais j'essaierai de le recevoir!" Cependant, dans Spring MVC, il est utilisé pour obtenir le paramètre URL exprimé au format REST.

Par exemple, supposons que vous définissiez le contrôleur comme suit:

SampleController.java


@Controller
@RequestMapping("page")
public class SampleController {

  @RequestMapping({"", "{num}"})
  public ModelAndView getMessages(@PathVariable("num") Optional<String> num) {
    if (num.ifPresent()) {
      //Si le paramètre est présent
    } else {
      //Si le paramètre n'existe pas
    }
    return new ModelAndView("index");
  }

}

Il s'agit d'une implémentation qui souhaite traiter la même méthode d'action avec ou sans valeurs de paramètres. Cette fois, nous supposons les URL http: // localhost / page / 1 '' et http: // localhost / page ''.

Lorsque la première est demandée, la chaîne de caractères après la deuxième barre oblique (** 1 **) est considérée comme un paramètre, donc ** 1 ** est entré dans l'argument num, et le résultat de ```ifPresent () `` `pour déterminer s'il y avait une entrée est ** true **. Ici, puisque la variable de type est * \ <String > *, il est possible d'obtenir la valeur avec num.get () comme type de chaîne de caractères.

Si cette dernière URL est demandée, il est déterminé que la valeur du paramètre n'existe pas et aucune valeur ** n'est entrée dans l'argument num **. Par conséquent, le résultat du jugement de «« ifPresent () »« est ** faux **.

Dans Java 8 ou version ultérieure, l'implémentation ci-dessus est suffisante. Jusqu'à présent, c'est une méthode courante qui est également introduite sur des sites externes et au sein de Qiita.

Mettre en œuvre sans utiliser facultatif

Cependant, étant donné que Optional est une classe nouvellement implémentée dans Java8, le programme ci-dessus ne peut pas être utilisé tel quel jusqu'à Java7. J'ai aussi pensé: "Puis-je définir le type d'argument sur * String * et l'obtenir avec * null *?", Mais je lance une ** NullPointerException **.

Vous pouvez l'implémenter en divisant la méthode d'action, mais je ne veux pas vraiment le faire parce que j'ai l'impression d'avoir perdu. (Je ne voulais pas avoir au moins deux de la même source dans la même classe, ou implémenter une méthode privée pour éviter la première. Si vous le faites, je souhaite utiliser la même source. )

Méthode de mise en œuvre

Ensuite, ce qu'il faut faire est de créer une classe qui peut être utilisée comme facultative (ci-après, ** classe de paramètres **) et de l'utiliser comme alternative.

SampleParameter.java


public class SampleParameter {
  private String num;

  //Si vous n'utilisez pas lombok, vous avez besoin de:
  // pubric String getNum() { return num; }
  // pubric String setNum(String num) { this.num = num; }

  boolean ifPresent() {
    return num != null;
  }
}

SampleController.java


@Controller
@RequestMapping("page")
public class SampleController {

  @RequestMapping({"", "{num}"})
  public ModelAndView getMessages(@PathVariable("num") SampleParameter num) {
    if (num.ifPresent()) {
      //Si le paramètre est présent
    } else {
      //Si le paramètre n'existe pas
    }
    return new ModelAndView("index");
  }

}

Oui, ça ressemble à ça. Comme pour @ ModelAttribute '', il semble que vous créez quelque chose comme une classe de formulaire. En fait, si la classe de paramètres n'a pas le nom de paramètre spécifié par `` @ RequestMapping``` Soyez prudent car il lance une ** NullPointerException **.

Avantages et précautions de mise en œuvre

mérite

À première vue, on dirait que nous réinventons les roues, mais c'est aussi une classe assez pratique.

  1. La méthode getter / setter peut être modifiée.
    C'est le plus grand mérite. En fait, lorsque j'ai défini la classe de paramètres, je n'ai pas utilisé lombok
    J'ai mis le ** processus de déchiffrement ** des paramètres chiffrés avec AES-128 + Base64 dans le getter.
  2. Vous pouvez ajouter votre méthode préférée / Vous pouvez ajouter votre méthode préférée.
    Tu peux faire ce que tu veux. (Cependant, il est nécessaire de préparer un getter correspondant au nom du paramètre)
  3. Vous pouvez librement étendre / implémenter.
    Cela ne signifie pas que Facultatif n'est pas possible, mais il s'agit d'une classe originale, donc
    Il peut être hérité / implémenté librement.

Précautions de mise en œuvre

Au contraire, les points suivants doivent être pris en compte lors de l'examen de la mise en œuvre.

  1. Il est nécessaire de préparer une méthode de définition dans la classe de paramètres qui correspond au nom de paramètre de ** @ RequestMapping **.
    Par exemple, pour `@ RequestMapping ({" "," {num} "})` `, vous avez besoin de la méthode` setNum (Object) `` `.
    Vous n'êtes peut-être pas très conscient de cela lors de la création de méthodes setter avec lombok.
  2. Il est également nécessaire de faire correspondre le nom d'argument de la méthode d'action.
    C'est un gros problème si vous avez des règles appropriées, mais c'est gênant si vous ne le faites pas.
    (Il peut y avoir une solution de contournement ici)

Recommended Posts

[Spring MVC] Implémentez les paramètres dynamiques inclus dans l'URL sans utiliser Facultatif (~ Java7)
Implémenter reCAPTCHA v3 dans Java / Spring
Mapper sans utiliser de tableau en java
Implémenter un bouton de partage dans Rails 6 sans utiliser Gem
Implémenter le test double dans JUnit sans utiliser de bibliothèques externes
Testez la classe injectée sur le terrain dans le test de démarrage Spring sans utiliser le conteneur Spring
Implémentez Thread en Java et essayez d'utiliser la classe anonyme Lambda
Authentifiez 3 paramètres ou plus au format JSON à l'aide de Spring Security
Comment contrôler les transactions dans Spring Boot sans utiliser @Transactional
Essayez d'utiliser RocksDB avec Java
Configuration Java avec Spring MVC
Implémentation de l'authentification en deux étapes en Java
Implémenter l'authentification de base en Java
Implémenter une combinaison de mathématiques en Java
2 Implémentez une analyse syntaxique simple en Java
Utilisation de Mapper avec Java (Spring)
Implémenter l'envoi d'e-mails en Java
Implémenter un tri rapide de type fonction en Java
Implémentez rm -rf en Java.
Implémenter la signature XML en Java
[Java] Obtenir des données de la base de données à l’aide du service singleton dans Spring (Boot)
Téléchargement et téléchargement de fichiers à l'aide d'Ajax avec Spring Boot (sans JQuery)