時々機能し、時々失敗するRESTWebサービスがあります。つまり、私の応答オブジェクトには、関連データのセットがいくつかあるものを含め、いくつかのサブオブジェクトがあります。これらのサブオブジェクトの数は、インバウンドパラメータセットによって異なります。
失敗応答を受け取るはずのユーザーID/pwを送信すると; つまり、不正なユーザーIDまたは無効なパスワードの場合、応答は期待どおりに返されます。
成功するはずのユーザーID/pwを送信し、複雑なオブジェクトを元に戻さない場合、応答は期待どおりに返されます。
最後に、応答に添付された複雑なオブジェクトの配列とともに返されるはずのユーザーID / pwを送信すると、500ページへのリダイレクトでロギングサイレント失敗が発生します。しばらくの間、主要な複雑なオブジェクトのサブオブジェクトとHibernateセッションのクローズ/使用できない問題について苦情が寄せられていました。全世界を初期化しようとしましたが、サブオブジェクトのセッションの問題についてHibernateから冗長な例外ログを取得しなくなったため、「役に立ちました」が、ログがまったく表示されずに500ページにリダイレクトされます。これがネストされた/非表示のセッションの問題であるかどうかを判断するために、手動で作成したオブジェクトをアタッチしようとしましたが、それでも500ページを取得しました。
以下は、いくつかの状況で機能するコントローラーコードですが、EnergyAudit[]配列に何かが入力されていると失敗します。
@RequestMapping(method= RequestMethod.GET,value="login")
public @ResponseBody LoginResponse login(@RequestParam("userName") String userNameIn, @RequestParam("password") String passwordIn){
LoginResponse theResponse = new LoginResponse();
try{
logger.info("Entering login for username: "+ userNameIn + " and pw: "+ passwordIn);
// CREATE!
EnergyAuditUser theUser;
try{
// DO A BUNCH OF STUFF TO VALIDATE THEY ARE AN OK USER LEFT OUT FOR OUR PURPOSES HERE.
// OK. IF WE GOT HERE, THEN WE CAN ASSUME THAT THERE IS A USER
// AND THEY GAVE US TEH GOOD DATA. GOOD JOB, USER!
theResponse.setSuccessOrFailureSw(Constants.SUCCESS);
theResponse.setResponseMessage("Successfully logged in!");
theResponse.setTheUser(theUser);
// NOW, IF THE USER IS NOT A REACH USER, WE WANT TO SUBMIT BACK ANY AUDITS
// REACH USERS WILL HAVE ANOTHER TRANSACTION SET TO ALLOW THEM TO PICK AND CHOOSE
// FROM THE DAYS AUDITS!
if (theUser.getEnergyAuditUserType().equalsIgnoreCase(EnergyAuditUser.COT_AUDITOR_TYPE)){
// WE SHOULD GET ANY AND ALL OPEN, ASSIGNED AUDITS FOR THIS USER.
EnergyAudit[] assignedAudits = auditService.getAssignedEnergyAuditsForUser(theUser.getEnergyAuditUserId(), false,false, true, false);
// theResponse.setEnergyAudits(assignedAudits);
// NOTE THAT HERE I ATTEMPTED TO CREATE A NON-BOUND AUDIT TO EVALUATE IF THE SILENT FAILURE WAS HIBERNATE SESSION RELATED. NO LOVE!
EnergyAudit bogusAudit = new EnergyAudit();
bogusAudit.setStartingInsulationRvalue(32);
bogusAudit.setStreetAddress("123 Chiefy Street");
bogusAudit.setAuditDate(new java.util.Date());
EnergyAudit[] bogusResults = new EnergyAudit[1];
bogusResults[0] = bogusAudit;
theResponse.setEnergyAudits(bogusResults);
}
// THIS USER / LOSER OUGHT TO BE GOOD TO GO!
return theResponse;
私を夢中にさせているのは、私のコンソールがここで何が起こっているのかについての情報を私に与えないということです。どんな洞察も大歓迎です。
ブライアン