【发布时间】:2019-12-10 04:14:18
【问题描述】:
基于this answer,我尝试使用java.util.Function 接口配置请求范围bean。
我的配置如下所示:
@Configuration
public class RequestConfig {
@Bean
public Function<? extends BaseRequest, RequestWrapper<? extends BaseRequest, ? extends BaseResponse>> requestWrapperFactory() {
return request -> requestWrapper(request);
}
@Bean
@RequestScope
public RequestWrapper<? extends BaseRequest, ? extends BaseResponse> requestWrapper(
BaseRequest request) {
RequestWrapper<?, ?> requestWrapper = new RequestWrapper<BaseRequest, BaseResponse>(request);
return requestWrapper;
}
}
我尝试像这样使用 bean:
@RestController
public class CheckRequestController {
private final RequestService<CheckRequest, CheckResponse> checkRequestServiceImpl;
@Autowired
private Function<CheckRequest, RequestWrapper<CheckRequest, CheckResponse>> requestWrapperFactory;
public CheckRequestController(
RequestService<CheckRequest, CheckResponse> checkRequestServiceImpl) {
super();
this.checkRequestServiceImpl = checkRequestServiceImpl;
}
@PostMapping(value = "/check", consumes = { MediaType.TEXT_XML_VALUE,
MediaType.MULTIPART_FORM_DATA_VALUE }, produces = MediaType.TEXT_XML_VALUE)
public ResponseEntity<CheckResponse> checkRequest(
@RequestBody(required = true) CheckRequest checkRequest) {
RequestWrapper<CheckRequest, CheckResponse> requestWrapper = requestWrapperFactory
.apply(checkRequest);
checkRequestServiceImpl.getResponse(requestWrapper);
return new ResponseEntity<CheckResponse>(requestWrapper.getResponse(),
HttpStatus.OK);
}
}
这里:
@RestController
public class CancelRequestController {
private final RequestService<CancelRequest, CancelResponse> cancelRequestServiceImpl;
@Autowired
private Function<CancelRequest, RequestWrapper<CancelRequest, CancelResponse>> requestWrapperFactory;
public CancelRequestController(
RequestService<CancelRequest, CancelResponse> cancelRequestServiceImpl) {
super();
this.cancelRequestServiceImpl = cancelRequestServiceImpl;
}
@PostMapping(value = "/cancel", consumes = { MediaType.TEXT_XML_VALUE,
MediaType.MULTIPART_FORM_DATA_VALUE }, produces = MediaType.TEXT_XML_VALUE)
public ResponseEntity<CancelResponse> CancelRequest(
@RequestBody(required = true) CancelRequest cancelRequest) {
RequestWrapper<CancelRequest, CancelResponse> requestWrapper = requestWrapperFactory
.apply(cancelRequest);
cancelRequestServiceImpl.getResponse(requestWrapper);
return new ResponseEntity<CancelResponse>(requestWrapper.getResponse(),
HttpStatus.OK);
}
}
但我得到一个例外,即没有定义 Function 类型的 bean。
Field requestWrapperFactory in CheckRequestController required a bean of type 'java.util.Function' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'java.util.Function' in your configuration.
使用泛型有问题吗?我哪里错了?
【问题讨论】:
-
你有没有像这样添加@SpringBootApplication(scanBasePackages={ "your.package1", "your.package2"})。
-
你确定你应该使用
org.springframework.cglib.core.internal.Function而不是java.util.Function吗? -
@Jesper 是的,你的权利。必须是
java.util.Function但得到相同的异常。
标签: java spring spring-boot dependency-injection spring-bean