[JAVA] Antwortdaten direkt im Frühjahr schreiben

Es gab eine Anfrage, direkt an HttpServletResponse zu schreiben, daher habe ich untersucht, wie das geht.

Weise

Sie müssen lediglich HttpServletResponse im Controller-Argument definieren und darauf schreiben.

HelloController.java


@Controller
public class HelloController {

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

Ich möchte das Muster verzweigen, um die Antwort zu schreiben, und das Muster, um den Ansichtsnamen zurückzugeben

Der Rückgabewert ist String. Wenn Sie direkt in die Antwort schreiben, wird null zurückgegeben.

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";
  }
}

Ich wurde beschwert, dass ich einen Fehler bekam, als ich null zurückgab

Es gab einen Bericht, dass ein Fehlerprotokoll angezeigt wurde, als ich null zurückgab. Als ich das Protokoll überprüfte, suchte ich nach JSP, konnte es aber nicht finden.

Als ich den Quellcode überprüfte, sah er wie folgt aus.

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";
  }
}

Bei einer solchen Implementierung schien es sicherlich nach einer JSP zu suchen und einen Fehler zu verursachen. Das heißt, der Renderprozess von View wird ausgeführt. Übrigens dachte ich, dass HttpServletResponse injiziert werden kann, aber es ist nicht die Hauptgeschichte, also ist es vorbei.

Lassen Sie uns den Inhalt des Frameworks überprüfen

Unter welchen Bedingungen darf der Rendervorgang nicht ausgeführt werden?

Wenn ich das DispatcherServlet überprüfe, führe ich den HandlerAdapter aus, um das ModelAndView abzurufen. Wenn der Rückgabewert zu diesem Zeitpunkt null ist, wird die Renderverarbeitung durch View nicht ausgeführt. Wenn Sie die Antwort direkt schreiben, wird dieses Verhalten erwartet. (DoDispatch, processDispatchResult usw.)

Wie ist dann die Bedingung, dass der Rückgabewert von HandlerAdapter null ist?

Bei der Verarbeitung von RequestMappingHandlerAdapter wird null zurückgegeben, wenn isRequestHandled von ModelAndViewContainer true wird. (GetModelAndView usw.)

Was sind also die Voraussetzungen dafür?

Es gibt verschiedene Bedingungen, aber in diesem Fall ist es eine Bedingung, dass das Argument der Controller-Methode HttpServletResponse enthält und der Rückgabewert vom Controller null ist. Die Quelle, in der der Fehler aufgetreten ist, verwendet die im Feld definierte HttpServletResponse, sodass der Rückgabewert des HandlerAdapter nicht null wurde.

Als Referenz das Verhalten, wenn der Ansichtsname null ist

Wenn Sie den Vorgang von applyDefaultViewName von DispatcherServlet aus verfolgen, können Sie sehen, dass die angeforderte URL als Ansichtsname angewendet wird.

Lösungen

Fügen wir als Argument HttpServletResponse hinzu. Wenn Sie dies nicht tun können, setzen wir den Rückgabetyp des Controllers wie folgt auf ModelAndView.

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");
  }
}

Sie können sehen, warum dies funktioniert, indem Sie ModelAndViewMethodReturnValueHandler lesen.

Recommended Posts

Antwortdaten direkt im Frühjahr schreiben
Erstellen Sie eine API zum Senden und Empfangen von Json-Daten mit Spring
Wie man Lombok im Frühling benutzt
Hinweise zur Verwendung von Spring Data JDBC
Schreiben Sie den Testcode mit Spring Boot
[So installieren Sie Spring Data Jpa]
Spring Data JPA: Schreiben Sie eine Abfrage in Pure SQL in @Query of Repository
Konvertieren Sie Anforderungsparameter im Frühjahr in Enum
Wie kann ich Spring Tool in Eclipse 4.6.3 einbinden?
Existiert mit der Spezifikation in Spring Data JPA
Null-Support-Cache in Spring Data Redis
So schreiben Sie den Spring AOP Point Cut Specifier
So überschreiben Sie Firebase-Daten mit Swift
So montieren Sie JSON direkt in Jackson
[Java FX] So schreiben Sie Eclipse-Berechtigungen in build.gradle
Anforderungs- und Antwortprotokolle mit Spring Boot ausgeben
So fügen Sie in Spring Boot einen Klassenpfad hinzu
Ordnen Sie GET-Anforderungen im Frühjahr komplexen Objekten zu.
So verbergen Sie Nullfelder als Antwort in Java
Einführung in Spring Boot + In-Memory Data Grid
Jackson kann hibernateLazyInitializer in Spring Data nicht JSON serialisieren JPA führt zu einem Fehler
So binden Sie mit einer Eigenschaftendatei in Spring Boot
So definieren Sie mehrere orm.xml in Spring4, JPA2.1
Wie schreibe ich Java String # getBytes in Kotlin?
Hinweise zum Schreiben von Kommentaren auf Englisch
[Spring Batch] Gibt Tabellendaten in eine CSV-Datei aus
So löschen Sie alle Daten in einer bestimmten Tabelle
So schreiben Sie einen Komponententest für Spring Boot 2
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
Ich habe versucht, mit Spring Data JPA zu beginnen
So erstellen Sie einen Daten-URI (base64) in Java
So schreiben Sie eine Datumsvergleichssuche in Rails
Verwendung von CommandLineRunner im Spring Batch von Spring Boot
Machen Sie die where-Klauselvariable in Spring Data JPA
So testen Sie den Bildschirm zum Hochladen von Dateien mit Spring + Selenium
Schreiben Sie mit ImageIO Byte-Array-Bilddaten in den Ausgabestream
Führen Sie swagger-ui in die in Spring Boot implementierte REST-API ein
Schreiben Sie Hamcrest Matcher im Lambda-Stil
Verwendung des In-Memory-Job-Repositorys mit Spring Batch
Wie schreibe ich einen Core Mod in Minecraft Forge 1.15.2
Wie schreibe ich Rails
So schreiben Sie in die Modellklasse, wenn Sie mit PlayFramework Binärdaten in der Datenbank speichern möchten
Verwendung derselben Mapper-Klasse in mehreren Datenquellen mit Spring Boot + MyBatis
Debuggen mit Eclipse
Verwenden Sie Interceptor im Frühjahr
Spring Data JDBC-Vorschau
Wie schreibe ich Mockito
Microservices in Spring Cloud
So schreiben Sie eine Migrationsdatei
Holen Sie sich Cookies im Frühling
Federdaten Dynamodb-Falle
So ändern Sie den Einstellungswert von application.properties beim Booten im Frühjahrsstart
Verwendung von JSON-Daten in der WebSocket-Kommunikation (Java, JavaScript)
Aufrufen und Verwenden der API in Java (Spring Boot)
Fluss bis zur Ausgabe von Tabellendaten, die mit Spring Boot angezeigt werden sollen
[IOS 14] Wie erhalte ich Bilddaten vom Datentyp direkt von PHPickerViewController?