В приведенном ниже коде, хотя MTEndOfDayParser является прототипом, MTEndOfDayProcessor является одноэлементным. Поскольку мы передаем объект MTEndOfDayParser в конструктор, наш класс-прототип MTEndOfDayParser не ведет себя как прототип. Не могли бы вы предложить несколько идей, позволяющих гарантировать, что MTEndOfDayParser сохранит свой характер прототипа? В настоящее время элемент данных баланса частного списка сохраняет предыдущие значения и не создает новый объект каждый раз, когда используется MTEndOfDayParser. Пожалуйста, предложите решение, чтобы класс MTEndOfDayParser рассматривался как прототип и каждый раз при необходимости создавался новый объект.
Класс MTEndOfDayProcessor.java
@Component("MT940MessageProcessor")
@Qualifier("MT940MessageProcessor")
public class MTEndOfDayProcessor extends MTProcessor {
@Autowired
public MTEndOfDayProcessor(@Qualifier(MT_END_OF_DAY_CONVERTER) MesssageConverter mtMessageConversion,
MTEndOfDayParser parser, Logger logger) {
super(mtMessageConversion, parser, logger);
}
}
Абстрактный класс MTProcessor.java
@Getter
public abstract class MTProcessor extends MesssageProcessor{
private MTMessage mtMessage;
public Logger logger;
protected MTParser mtParser;
public MTProcessor(MesssageConverter mtMessageConversion, MTParser mtParser, Logger logger) {
this.converter = mtMessageConversion;
this.mtParser = mtParser;
this.logger = logger;
}
public void prcessMessage(InputStream body, ProcessingQBlobInfo processingQBlobInfo) throws IOException {
SwiftMT940Lexer swiftMT940Lexer = new SwiftMT940Lexer(CharStreams.fromStream(body));
CommonTokenStream tokens = new CommonTokenStream(swiftMT940Lexer);
SwiftMT940Parser swiftMT940Parser = new SwiftMT940Parser(tokens);
swiftMT940Parser.removeErrorListeners();
swiftMT940Parser.addErrorListener(new ParserErrorHandler(logger));
ParseTreeWalker walker = new ParseTreeWalker();
MTParserListner mtParserListern = new MTParserListner(mtParser, logger,
Command.toCommand(processingQBlobInfo.getCommand()));
walker.walk(mtParserListern, swiftMT940Parser.message());
mtMessage = mtParser.getMessage();
//mtParser.reset();
mtMessage.setProcessingQBlobInfo(processingQBlobInfo);
this.statements = converter.convert(mtMessage);
}
protected void createDBRecord() {
financialService.createDBRecords(statements);
}
}
Класс MTEndOfDayParser.java
@Component("MT940MessageProcessor")
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MTEndOfDayParser extends MTParser {
Logger logger;
MTEndOfDayMessage mtEndOfDayMessage;
private List balances;
public MTEndOfDayParser(Logger logger) {
super();
this.logger = logger;
this.mtEndOfDayMessage = new MTEndOfDayMessage();
this.balances = new ArrayList();
}
@Override
public String process(String blockText, String activeTag, String prevTag) {
switch (activeTag) {
case "60F", "60M", "64", "65": {
processAccountBalance(blockText, activeTag);
}
case "62M", "62F": {
processAccountBalance(blockText, activeTag);
bRead62Tag = true;
}
default : super.processCommon(blockText, activeTag, prevTag, mtEndOfDayMessage);
}
return prevTag;
}
@Override
public MTMessage getMessage() {
mtEndOfDayMessage.setBalance(balances);
return mtEndOfDayMessage;
}
private void processAcountBalance(String text, String activeTag) {
String methodKey="processAcountBalance";
Balance balance = null;
switch (activeTag) {
case "60F": {
balance = AccountBalanceParser.processBalance(text);
balance.setBalanceType(BalanceType.OPBD);
}
case "60M": {
balance = AccountBalanceParser.processBalance(text);
balance.setBalanceType(BalanceType.ITOP);
}
case "62M": {
balance = AccountBalanceParser.processBalance(text);
balance.setBalanceType(BalanceType.ITCL);
}
case "62F": {
balance = AccountBalanceParser.processBalance(text);
balance.setBalanceType(BalanceType.CLBD);
}
case "64": {
balance = AccountBalanceParser.processBalance(text);
balance.setBalanceType(BalanceType.CLAV);
}
case "65": {
balance = AccountBalanceParser.processBalance(text);
balance.setBalanceType(BalanceType.FWAV);
}
default: logErrormessage(methodKey, activeTag);
}
if(null != balance) {
this.balances.add(balance);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... ng-boot-ja
Почему природа прототипа нарушается, даже если класс изображен как Protoyple при весенней загрузке Java ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение