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.
Sie sollten "HandlerMethodArgumentResolver" verwenden!
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
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.
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
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