[JAVA] Pour écrire des données de réponse directement dans Spring

Il y avait une demande d'écrire directement dans HttpServletResponse, alors j'ai étudié comment le faire.

manière

Tout ce que vous avez à faire est de définir HttpServletResponse dans l'argument Controller et d'y écrire.

HelloController.java


@Controller
public class HelloController {

  @RequestMapping(value="/", method=RequestMethod.GET)
  public void hello(HttpServletResponse response) throws Exception {
    response.getWriter().write("hogehoge");
  }
}

Je veux créer une branche pour le modèle pour écrire la réponse et le modèle pour renvoyer le nom de la vue

La valeur de retour est String. Si vous écrivez directement dans la réponse, null sera renvoyé.

HelloController.java


@Controller
public class HelloController {

  @RequestMapping(value="/{param}", method=RequestMethod.GET)
  public String hello(HttpServletResponse response, @PathVariable String param) throws Exception {
    if(Objects.equals("param", param)){
      response.getWriter().write("hogehoge");
      return null;
    }
    return "hello";
  }
}

Je me suis plaint d'avoir reçu une erreur lorsque j'ai renvoyé null

Il y avait un rapport indiquant qu'un journal des erreurs est apparu lorsque j'ai renvoyé null. Quand j'ai vérifié le journal, j'ai cherché JSP mais je ne l'ai pas trouvé.

Donc, quand j'ai vérifié le code source, cela ressemblait à ce qui suit.

HelloController.java


@Controller
public class HelloController {

  @Inject
  HttpServletResponse response

  @RequestMapping(value="/{param}", method=RequestMethod.GET)
  public String hello(@PathVariable String param) throws Exception {
    if(Objects.equals("param", param)){
      response.getWriter().write("hogehoge");
      return null;
    }
    return "hello";
  }
}

Certes, une fois implémenté comme ça, il semblait rechercher une JSP et provoquer une erreur. Autrement dit, le processus de rendu de View est en cours d'exécution. Au fait, j'ai pensé que HttpServletResponse pouvait être injecté, mais ce n'est pas l'histoire principale, donc c'est fini.

Vérifiez le contenu du framework

Quelles sont les conditions pour que le processus de rendu ne soit pas exécuté?

Lorsque je vérifie le DispatcherServlet, j'exécute le HandlerAdapter pour obtenir le ModelAndView. À ce stade, si la valeur de retour est nulle, le traitement de rendu par View ne sera pas exécuté. Si vous écrivez directement la réponse, ce comportement est attendu. (DoDispatch, processDispatchResult, etc.)

Ensuite, quelle est la condition pour que la valeur de retour de HandlerAdapter soit nulle?

En examinant le traitement de RequestMappingHandlerAdapter, null est renvoyé lorsque isRequestHandled de ModelAndViewContainer devient true. (GetModelAndView etc.)

Alors, quelles sont les conditions pour que cela soit vrai?

Il existe différentes conditions, mais dans ce cas, il s'agit d'une condition selon laquelle HttpServletResponse est dans l'argument de la méthode Controller et la valeur de retour de Controller est nulle. La source où l'erreur s'est produite utilise le HttpServletResponse défini dans le champ, de sorte que la valeur de retour du HandlerAdapter n'est pas devenue nulle.

Pour référence, le comportement lorsque le nom de la vue est nul

Si vous suivez le processus de applyDefaultViewName de DispatcherServlet, vous pouvez voir que l'URL demandée est appliquée comme nom de vue.

Solution

Ajoutons HttpServletResponse comme argument. Si vous ne pouvez pas faire cela, définissons le type de retour de Controller sur ModelAndView comme suit.

HelloController.java


@Controller
public class HelloController {

  @Inject
  HttpServletResponse response

  @RequestMapping(value="/{param}", method=RequestMethod.GET)
  public ModelAndView hello(@PathVariable String param) throws Exception {
    if(Objects.equals("param", param)){
      response.getWriter().write("hogehoge");
      return null;
    }
    return new ModelAndView("hello");
  }
}

Vous pouvez voir pourquoi cela fonctionne en lisant ModelAndViewMethodReturnValueHandler.

Recommended Posts

Pour écrire des données de réponse directement dans Spring
Créez une API pour envoyer et recevoir des données Json avec Spring
Comment utiliser Lombok au printemps
Remarques sur l'utilisation de Spring Data JDBC
Écrire du code de test avec Spring Boot
[Comment installer Spring Data Jpa]
Spring Data JPA: écrivez une requête en Pure SQL dans @Query of Repository
Convertir les paramètres de demande en Enum au printemps
Comment inclure Spring Tool dans Eclipse 4.6.3?
Existe en utilisant la spécification dans Spring Data JPA
Cache de support nul dans Spring Data Redis
Comment écrire un spécificateur de coupe de point Spring AOP
Comment écraser les données Firebase avec Swift
Comment assembler JSON directement dans Jackson
[Java FX] Comment écrire des autorisations Eclipse dans build.gradle
Sortie des journaux de demande et de réponse avec Spring Boot
Comment ajouter un chemin de classe dans Spring Boot
Mappez les requêtes GET sur des objets complexes dans Spring.
Comment masquer les champs nuls en réponse en Java
Introduction à Spring Boot + In-Memory Data Grid
Jackson ne peut pas sérialiser JSON hibernateLazyInitializer dans Spring Data JPA entraîne une erreur
Comment se lier avec un fichier de propriétés dans Spring Boot
Comment définir plusieurs orm.xml dans Spring4, JPA2.1
Comment écrire Java String # getBytes dans Kotlin?
Notes sur la façon de rédiger des commentaires en anglais
[Spring Batch] Données de la table de sortie dans un fichier CSV
Comment effacer toutes les données d'une table particulière
Comment écrire un test unitaire pour Spring Boot 2
Comment créer un projet Spring Boot dans IntelliJ
J'ai essayé de démarrer avec Spring Data JPA
Comment créer un URI de données (base64) en Java
Comment écrire une recherche de comparaison de dates dans Rails
Comment utiliser CommandLineRunner dans Spring Batch of Spring Boot
Créer la variable de clause where dans Spring Data JPA
Comment tester l'écran de téléchargement de fichiers avec Spring + Selenium
Écrire des données d'image de tableau d'octets dans le flux de sortie à l'aide d'ImageIO
Présentez swagger-ui à l'API REST implémentée dans Spring Boot
Être capable d'écrire Hamcrest Matcher dans le style lambda
Comment utiliser le référentiel de jobs en mémoire avec Spring Batch
Comment écrire un mod de base dans Minecraft Forge 1.15.2
Comment écrire des rails
Comment écrire dans la classe Model lorsque vous souhaitez enregistrer des données binaires dans DB avec PlayFramework
Comment utiliser la même classe Mapper dans plusieurs sources de données avec Spring Boot + MyBatis
Pour déboguer avec Eclipse
Utilisez Interceptor au printemps
Aperçu de Spring Data JDBC
Comment écrire Mockito
Microservices dans Spring Cloud
Comment écrire un fichier de migration
Obtenez des cookies au printemps
piège dynamodb de données de ressort
Comment modifier la valeur de paramètre de application.properties au moment du démarrage dans Spring Boot
Comment utiliser les données JSON dans la communication WebSocket (Java, JavaScript)
Comment appeler et utiliser l'API en Java (Spring Boot)
Flux jusqu'à la sortie des données de la table à afficher avec Spring Boot
[IOS 14] Comment obtenir des données d'image de type Data directement à partir de PHPickerViewController?