そこで、学校のプロジェクトでは、ユーザーが水中生物などに関するレポートを送信できるサイトを作成しました。単純な依存性注入(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
}
}
}
サーブレットコントローラがサービス(挿入されたもの)を呼び出し、サービスの戻り値をチェックし、エラーが発生した場合はサービスでgetLastErrors()を呼び出して、何が問題だったかなどをユーザーに通知するという考え方です。これはスレッドセーフではないことに注意してください-@Inject'edReportService(reportService)は、サーブレットを使用するすべてのスレッドで共有されます
- それは(指を交差させる)ですか?
- このエラーメカニズムをどのように改善できますか?
ありがとう