gpt4 book ai didi

java - Servlet + 注入(inject) - 多线程问题

转载 作者:行者123 更新时间:2023-11-30 04:43:49 26 4
gpt4 key购买 nike

因此,对于一个学校项目,我们创建了一个网站,用户可以在其中提交有关水下生物等的报告。我们使用简单的依赖项注入(inject) (javax.inject) 和错误检查模式,如下所示:

ReportService.java

public interface ReportService {
public static enum ReportServiceErrorsENUM {
DB_FAILURE, WRONG_COORD // etc
}
public Set<ReportServiceErrorsENUM> getLastErrors();
public int addNewReport(Report report);
}

ReportServiceImpl.java

public class ReportServiceImpl implements ReportService {

private Set<ReportServiceErrorsENUM> lastErrors;
private @Inject ReportDAO reportDAO;

@Override
public Set<ReportServiceErrorsENUM> getLastErrors() {
return this.lastErrors;
}

@Override
public int addNewReport(Report report) {
lastErrors= new HashSet<ReportServiceErrorsENUM>();//throw away previous errors
UserInput input = report.getUserInput();
if (input.getLatitude() == null) {
addError(ReportServiceErrorsENUM.WRONG_COORD);
}
// etc etc
if (reportDAO.insertReport(report) != 0) {
// failure inserting the report in the DB
addError(ReportServiceErrorsENUM.DB_ERROR);
}
if (lastErrors.isEmpty()) // if there were no errors
return EXIT_SUCCESS; // 0
return EXIT_FAILURE; // 1
}
}

SubmitReportController.java

@WebServlet("/submitreport")
public class SubmitReportController extends HttpServlet {
private static final long serialVersionUID = 1L;
private @Inject ReportService reportService;

@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Report report = new Report();
// set the report's fields from the HttpServletRequest attributes
if(reportService.addNewReport(report) == ReportService.EXIT_FAILURE) {
for(ReportServiceErrorsENUM error : reportService.getLastErrors())
// display the errors etc
} else {
// display confirmation
}
}
}

这个想法是,Servlet Controller 调用服务(被注入(inject)),然后检查服务的返回值,如果出现错误,则调用服务上的 getLastErrors() - 通知用户出了什么问题等。现在我刚刚意识到这不是线程安全的 - @Inject'ed ReportService (reportService) 将由使用 servlet 的所有线程共享

  1. 是(交叉手指)吗?
  2. 如何改进这一错误机制?

谢谢

最佳答案

通常对于 servlet,您希望将这些变量(通常称为“状态”)保留在某个容器管理的上下文中。我会将这些错误移至请求范围 - 这样它们就存储在请求对象上(概念上),并且任何处理同一请求的 servlet/jsp/任何内容都可以查看/编辑它们。不同的请求意味着不同的数据存储。

可以在此处找到使用 servlet 的请求范围的示例代码:http://www.exampledepot.com/egs/javax.servlet/State.html

关于java - Servlet + 注入(inject) - 多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11603100/

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