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.
Vous devez utiliser HandlerMethodArgumentResolver
!
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
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.
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!
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! !!