[JAVA] Binden Sie die Anfrage an eine Klasse und erhalten Sie sie

Überblick

Wenn Sie Header, Parameter usw. von "HttpServeletRequest" abrufen möchten Vorerst

public Oject sample(HttpServletRequest request) {
    //wird bearbeitet
}

Wenn Sie dies tun, können Sie dies in der Controller-Klasse tun. Da die Verantwortung der Controller-Klasse zunimmt, Ich wollte nur die erforderlichen Werte an die entsprechenden Objekte binden und diese empfangen.

Methode

Sie sollten "HandlerMethodArgumentResolver" verwenden!

Einzelheiten

Ich möchte nur verstehen, wie man "HandlerMethodArgumentResolver" verwendet Versuchen wir einfach, den Wert des Anforderungsparameters mit Ihrer eigenen Klasse anstelle von String zu erhalten

Klasse, die Parameter empfängt

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;

@Getter
@AllArgsConstructor
@ToString
public class SampleArgument {
    private String value;

    public static SampleArgument of(String value) {
        return new SampleArgument(value);
    }
}

Für meinen persönlichen Geschmack kann die Instanziierung mit der "of" -Methode erfolgen. Eine einfache Klasse, die die als Argument in value empfangene Zeichenfolge enthält.

HandlerMethodArgumentResolver Eine Klasse zum Binden an eine beliebige Klasse im Fach

import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

@Component
public class SampleResolver implements HandlerMethodArgumentResolver {

    //Details werden weggelassen. .. ResolveArgument wird nur ausgeführt, wenn true
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return true;
    }

    //Das hier zurückgegebene Objekt steht als Argument zur Verfügung
    @Override
    public Object resolveArgument(
            MethodParameter       parameter,
            ModelAndViewContainer mavContainer,
            NativeWebRequest      webRequest,
            WebDataBinderFactory  binderFactory
    ) throws Exception {

        String value = webRequest.getParameter("value");
        return SampleArgument.of(value);
    }
}

Implementiert die Schnittstelle "HandlerMethodArgumentResolver". Hier wird @ Component hinzugefügt, um sich als Bean zu registrieren.

Aktivieren Sie den implementierten HandlerMethodArgumentResolver

import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;

@Configuration
@AllArgsConstructor
public class HandlerMethodArgumentResolverConfiguration implements WebMvcConfigurer {
    private SampleResolver sampleResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(sampleResolver);
    }
}

Da ich @Component früher hinzugefügt habe, empfängt Resolver es im Konstruktor (selbstfahrende Generierung mit @ AllArgsConstructor) Der Punkt ist -Implementieren der WebMvcConfigurer-Schnittstelle

Funktionsprüfung

Wir haben die folgenden Controller vorbereitet.

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/HandlerMethodArgumentResolver")
@Slf4j
public class HandlerMethodArgumentResolverController {
    @GetMapping("/sample")
    @ResponseBody
    public SampleArgument sample(SampleArgument sampleArgument) {
        log.info("sampleArgument: {}", sampleArgument);
        return sampleArgument;
    }
}

http://localhost:8080/HandlerMethodArgumentResolver/sample?value=HelloWorld Wenn Sie zugreifen

sampleArgument: SampleArgument(value=HelloWorld)

Ich konnte bestätigen, dass ich mich an meine eigene Klasse binden konnte! !!

Recommended Posts

Binden Sie die Anfrage an eine Klasse und erhalten Sie sie
[Code Golf] Entleeren Sie den Code und senden Sie ihn an AtCoder [Compressed Golf]
Verwendung der Wrapper-Klasse
"Warten Sie, bis der Prozess abgeschlossen ist" und beenden Sie den Prozess, da er bestehen bleibt
Der Unterschied zwischen der Ruby-Instanzmethode und der Klassenmethode ist leicht zu verstehen.
Fügen Sie Android eine vorgefertigte JAR-Bibliothek hinzu und rufen Sie sie im Framework auf
Fügen Sie das Datum zu den von gcutil erfassten GC-Statistiken hinzu und geben Sie es aus.
Bestätigung und Umgestaltung des Flusses von der Anfrage zum Controller in [httpclient]
Ist es möglich, die Bibliothek (aar) in die Android-Bibliothek (aar) zu stellen und zu verwenden?
[Java] Verwendung der File-Klasse
[Verarbeitung × Java] Verwendung der Klasse
Wie man die Zehner und Einsen findet
[Java] Verwendung der Calendar-Klasse
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse
Informationen zu next () und nextLine () der Scannerklasse
So finden Sie die Gesamtpunktzahl und die Durchschnittspunktzahl
[Java] Verwendung der Kalenderklasse und der Datumsklasse
Ich möchte das in der Datenbank gespeicherte Protokoll morphologisch analysieren und in der Datenbank speichern, um Nachrichten 1 zu klassifizieren
Übergeben Sie ein Argument an die Methode und erhalten Sie das Ergebnis der Operation als Rückgabewert