[JAVA] J'ai vérifié car la réponse était étrange lors du débogage avec Tomcat 8

Lorsque je déboguais une application Web accédant au serveur avec ajax, la réponse était étrange pour une raison quelconque. Ni le corps de la réponse ni l'en-tête HTTP ne sont renvoyés. J'ai enquêté sur la cause, alors je l'ai résumé.

Environnement d'exécution

Test.java


@RestController
public class TestController {

    @RequestMapping(value = "/test.do", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public String test(HttpServletRequest request) throws Exception {
        return "{ \"success\" : true }";
    }
}

ajax.js


var req = new XMLHttpRequest();
req.open("POST", "test.do");
req.send();

Statut

--Parce que j'ai pu interrompre la méthode de test de TestController, il n'y a pas d'erreur dans l'URL

Cause

Quand je suis allé de plus en plus profond dans l'exécution de l'étape, une exception a été lancée dans NioChannel.class``` dans tomcat-coyote.jar.

NioChannel.class


/**
 * This method should be used to check the interrupt status before
 * attempting a write.
 *
 * If a thread has been interrupted and the interrupt has not been cleared
 * then an attempt to write to the socket will fail. When this happens the
 * socket is removed from the poller without the socket being selected. This
 * results in a connection limit leak for NIO as the endpoint expects the
 * socket to be selected even in error conditions.
 */
protected void checkInterruptStatus() throws IOException {
    if (Thread.interrupted()) {
         throw new IOException(sm.getString("channel.nio.interrupted"));
    }
}

Cette exception a été interceptée dans la couche supérieure et réécrite en réponse à l'erreur.

Épilogue

J'avais une trace de pile de cette exception sur la console à chaque fois, mais je l'ignorais car elle retournait 200. Si cela ressemble à une erreur, vous ne pouvez pas l'ignorer. Mais je pense que c'est un piège terrible.

Recommended Posts

J'ai vérifié car la réponse était étrange lors du débogage avec Tomcat 8
J'étais coincé avec la gestion des fuseaux horaires lors du formatage avec SimpleDateFormat
J'ai vérifié le nombre de taxis avec Ruby
Lors de la création de la première page, j'étais coincé avec la gestion des images (super débutant)
Lorsque j'ai essayé de faire défiler automatiquement avec JScrollBar, le gestionnaire d'événements n'a été dessiné qu'une seule fois.
Ce à quoi j'étais accro avec l'API REST Redmine
J'étais confus parce qu'il y avait une scission dans le tableau
L'histoire à laquelle j'étais accro lors de la création de STS
Lorsque j'ai créé un graphique à barres avec MPAndroidChart, l'étiquette de l'axe des x était mal alignée pour une raison quelconque
Ce que j'ai fait lorsque la base de données n'a pas démarré avec docker-compose up
Ce à quoi j'étais accro lors de la mise en œuvre de l'authentification Google avec des rails
UnsupportedClassVersionError a été généré lorsque j'ai placé le fichier .war construit avec Eclipse sur EC2 et l'ai exécuté.
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
Réponse lorsque le serveur Tomcat ne démarre pas
Mémorandum: Ce à quoi j'étais accro quand j'ai frappé l'API de comptabilité freee
J'ai vérifié la bibliothèque "junit-quickcheck" qui peut effectuer des tests basés sur les propriétés avec JUnit.
[Java] On a dit que Java pouvait concaténer des chaînes avec +, alors j'ai vérifié
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
Enregistré parce que j'étais accro à l'entrée standard de la classe Scanner
J'étais accro au scrollview car je ne pouvais pas appuyer sur la taille variable UIView
J'étais accro aux tests unitaires avec l'opérateur de tampon dans RxJava