gpt4 book ai didi

java - Autowiring 在 spring-boot 中供应商接口(interface)的重写 `get()` 方法中不起作用

转载 作者:行者123 更新时间:2023-12-02 01:23:14 25 4
gpt4 key购买 nike

我有一个名为 WorkerThread 的类,它重写 get() 方法 实现的供应商接口(interface)。在 WorkerThread 类中,MockService 的 Autowiring 正在发生,但是当调用这些服务的方法时,它会抛出 NullPointerException。

我在 MockService 中创建了 @PostConstruct init() 方法,并在启动时打印日志。另外,如果我删除 MockService 的方法调用,代码就可以正常工作。

SomeServiceImpl.java(WorkerThread调用类)

//initializing engine pool for processing which will be responsible for providing engine Objects
Supplier<OcrData> callable = new WorkerThread( enginesPool, imageFile, scanId, pageCount, saveOcrContent,
maxLangConsideration, pageThreshold, preprocess, outputFolder, saveInMongo );
response = CompletableFuture.supplyAsync( callable, executorService );

WorkerThread.java

@Component
public class WorkerThread implements Supplier<OcrData>
{
private static final Logger LOG = LoggerFactory.getLogger( WorkerThread.class );

private boolean SAVE_IN_MONGO;
private String outputFolder;
private Boolean preprocess;
private Integer pageThreshold;
private Integer maxLangConsideration;
private Boolean saveOcrContent;
private EnginesPool enginesPool;
private File imageFile;
private String scanId;
private String threadId;
private Integer pageCount;

private DocumentProcessor documentProcessor;
private MockService mockService;
private DummyService dummyService;

@Autowired
public void setMockAbbyyService( MockService mockService )
{
this.mockService = mockService;
}


@Autowired
public void setDocumentProcessor( DocumentProcessor documentProcessor )
{
this.documentProcessor = documentProcessor;
}


public WorkerThread()
{
}


public WorkerThread( EnginesPool pool, File source, String imageKey, Integer pageCount, Boolean saveOcrContent,
Integer maxLang, Integer threshold, Boolean preprocess, String outputFolder, boolean saveInMongo )
{
enginesPool = pool;
scanId = imageKey;
this.saveOcrContent = saveOcrContent;
maxLangConsideration = maxLang;
pageThreshold = threshold;
this.preprocess = preprocess;
this.outputFolder = outputFolder;
this.pageCount = pageCount;
this.SAVE_IN_MONGO = saveInMongo;


File reducedResolutionImage = null;
try {
boolean performPreprocess = this.preprocess;
if ( performPreprocess ) {


if ( pageCount > pageThreshold ) {
reducedResolutionImage = documentProcessor.getPreprocessedImage( imageFile );
}
}
} catch ( Exception ex ) {
LOG.error( "Error while getting preprocessed image for scanId: {}", ex, scanId );
}
if ( null != reducedResolutionImage ) {
imageFile = reducedResolutionImage;

} else {
imageFile = source;
}
}


@Override
public OcrData get()
{
Response response = null;
OcrData ocrData = new OcrData();
this.threadId = String.valueOf( Thread.currentThread().getId() );
try {
LOG.info( "Thread {} started ", this.threadId );

if ( imageFile != null ) {
LOG.info( "Thread {} processing scanId: {}", this.threadId, scanId );
try {
// SAVE_IN_MONGO false got for ocr
LOG.info( "Value of save in mongo {}", SAVE_IN_MONGO );
// SAVE_IN_MONGO flag to check mock abbyy
if ( SAVE_IN_MONGO ) {
// SAVE_IN_MONGO true get reponse from mongo if found then return
LOG.info( "fetching data from mongo" );
//HERE it fails complaining for null
if(mockService != null) {
response = mockService.getResponse( imageFile );
}else {
LOG.warn( "Could not autowire mock service." );
response = null;
}
LOG.info( "data fetched from mongo with response: {}", response!= null?"data exist":"no data found" );
// response not found
if ( response == null ) {
// submit for ocr
LOG.info("submiting request for ocr");
response = processImageFile( imageFile );
LOG.info("response for ocr : {}", response!=null?"ocr done": "ocr failed");
if ( response != null ) {
// saving result in mongo
//HERE also it fails
mockService.saveTo( response, imageFile );
}
}
} else {
// otherwise go for ocr.
response = processImageFile( imageFile );
}
//build ocrDate response object
ocrData.setResponse( response );
ocrData.setStatus( ScanRequestStatus.OCRED.getStatus() );
} catch ( Exception ex ) {
LOG.error( "Thread {}: Error caused {} for processing scanId: {}", this.threadId, ex, scanId );
ocrData.setException( ex );
ocrData.setStatus( ScanRequestStatus.FAILED.getStatus() );
ex.printStackTrace();
}
}
LOG.info( "Thread {} finished ", this.threadId );
} catch ( Exception ex ) {
LOG.error( "Error occurred while processing requests in parallel with exception {}", ex );
}

return ocrData;
}


private Response processImageFile( File imageFile ) throws Exception
{
//code to process
}
}

MockService.java

public interface MockService
{
String getImageKey( File file );

Response getResponse( File file );

void saveTo( Response responseFrom, File file );
}

MockServiceImpl.java

@Service
public class MockServiceImpl implements MockService
{
private static final Logger LOG = LoggerFactory.getLogger( MockServiceImpl.class );
private MockRepository mockAbbyyRepository;


@Autowired
public void setMockRepository( MockRepository mockRepository )
{
this.mockRepository = mockRepository;
}

@PostConstruct
public void postConstruct(){
// this log is getting printed
LOG.info( "After constructing MockService object" );
}

@Override
public String getImageKey( File file )
{
LOG.debug( "Getting image key for file {}", file.getName() );
FileInputStream fin = null;
byte fileContent[] = new byte[(int) file.length()];

try {
fin = new FileInputStream( file );
fin.read( fileContent );
} catch ( FileNotFoundException e ) {
LOG.error( "Exception found while getting image key", e );
} catch ( IOException e ) {
LOG.error( "Exception found while getting image key", e );
} catch ( Exception e ) {
LOG.error( "Exception found while getting image key", e );
}

String s = new String( fileContent );

String imageKey = sha256Encoding( s );

return imageKey;
}


@Override
public AbbyyResponse getAbbyyResponse( File file )
{
// code to get response
}


@Override
public void saveTo( AbbyyResponse responseFrom, File file )
{

// code to save the response
}


private String sha256Encoding( String phrase )
{
return Hashing.sha256().hashString( phrase, StandardCharsets.UTF_8 ).toString();
}

}

请分享您对此问题的意见。提前致谢

最佳答案

Supplier<OcrData> callable = new WorkerThread()无法 Autowiring 。

要获取 Spring 管理的 Bean,

Supplier<OcrData> callable = applicationContext.getBean(WorkerThread.class);

Supplier<OcrData> callable = new WorkerThread();
AutowireCapableBeanFactory beanFactory = applicationContext.getBean(AutowireCapableBeanFactory.class);
beanFactory.autowiredBean(callable);

关于java - Autowiring 在 spring-boot 中供应商接口(interface)的重写 `get()` 方法中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57321577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com