Based on this answer I try to configure a request scope bean using java.util.Function
interface.
My Configuration looks like this:
@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;
}
}
And I try to use the bean like this:
@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);
}
}
And here:
@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);
}
}
But I get the exception that there is no bean of type Function
defined.
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.
Is there a problem by using generic types? What do I wrong?