[JAVA] Liez la demande à n'importe quelle classe et recevez-la

Aperçu

Lorsque vous souhaitez obtenir des en-têtes, des paramètres, etc. à partir de "HttpServeletRequest" Pour le moment

public Oject sample(HttpServletRequest request) {
    //En traitement
}

Si vous le faites, vous pouvez le faire dans la classe de contrôleur, Puisque la responsabilité de la classe de contrôleur augmente, Je voulais lier uniquement les valeurs requises aux objets appropriés et les recevoir.

Méthode

Vous devez utiliser HandlerMethodArgumentResolver!

Détails

Je veux juste comprendre comment utiliser HandlerMethodArgumentResolver Essayons facilement de recevoir la valeur du paramètre de requête avec votre propre classe au lieu de String

Classe qui reçoit des paramètres

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

Pour mon goût personnel, l'instanciation est possible avec la méthode «de». Une classe simple qui contient la chaîne reçue comme argument dans value.

HandlerMethodArgumentResolver Classe à lier à n'importe quelle classe du sujet

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 {

    //Les détails sont omis. .. ResolveArgument est exécuté uniquement si true
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return true;
    }

    //L'objet renvoyé ici sera disponible en argument
    @Override
    public Object resolveArgument(
            MethodParameter       parameter,
            ModelAndViewContainer mavContainer,
            NativeWebRequest      webRequest,
            WebDataBinderFactory  binderFactory
    ) throws Exception {

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

Implémente l'interface HandlerMethodArgumentResolver. Ici, @ Component est ajouté pour s'enregistrer en tant que bean.

Activer le HandlerMethodArgumentResolver implémenté

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

Depuis que j'ai ajouté @Component plus tôt, Resolver le reçoit dans le constructeur (génération auto-propulsée avec @ AllArgsConstructor) Le point est -Implémentation de l'interface WebMvcConfigurer -Donner @ Configuration à la classe Après cela, ajoutez le résolveur implémenté dans la liste avec la méthode d'implémentation de ʻaddArgumentResolvers` et c'est OK!

Contrôle de fonctionnement

Nous avons préparé les contrôleurs suivants.

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 Lorsque vous accédez

sampleArgument: SampleArgument(value=HelloWorld)

J'ai pu confirmer que j'étais capable de me lier à ma propre classe! !!

Recommended Posts

Liez la demande à n'importe quelle classe et recevez-la
[Code Golf] Dégonflez le code et soumettez-le à AtCoder [Compressed Golf]
Comment utiliser la classe wrapper
"Attendez que le processus se termine" et arrêtez le processus car il reste
Facile à comprendre la différence entre la méthode d'instance Ruby et la méthode de classe.
Ajoutez une bibliothèque jar pré-construite à Android et appelez-la dans le cadre
Ajoutez la date aux statistiques GC acquises par gcutil et affichez-la.
Confirmation et refactoring du flux de la requête au contrôleur dans [httpclient]
Est-il possible de mettre la bibliothèque (aar) dans la bibliothèque Android (aar) et de l'utiliser?
[Java] Comment utiliser la classe File
[Traitement × Java] Comment utiliser la classe
Comment trouver les dizaines et les unités
[Java] Comment utiliser la classe Calendar
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
À propos de next () et nextLine () de la classe Scanner
Comment trouver le score total et le score moyen
[Java] Comment utiliser la classe Calendar et la classe Date
Je souhaite analyser morphologiquement le journal stocké dans la base de données et le stocker dans la base de données pour classer les messages 1
Passez un argument à la méthode et recevez le résultat de l'opération comme valeur de retour