首页 > 解决方案 > HttpUrlConnection 不显示被调用的java程序抛出的异常

问题描述

我有服务抛出 RuntimeException 与 ajax 调用一起工作正常。如果我使用来自另一个 java 程序异常字符串的 HttpUrlConnection 调用该服务,而不是显示“内部服务器错误”,响应代码为 500。

@Path("poService")
public class PoService {
    @Context
    private UriInfo context;
    @GET
    @Path("getPo/{poNo}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getPo(@PathParam("poNo") int poNo ) throws Exception{
       String urlStr = AppConstant.WEBOLIS_PATH + "po.htm?getPoForSrnConsReport=true&pono="+poNo ;
       URL url = new URL(urlStr);
       HttpURLConnection con = (HttpURLConnection) url.openConnection();
       //con.setRequestProperty("User-Agent", AppConstant.USER_AGENT);
       int responseCode = con.getResponseCode();
       System.out.println("\nSending 'GET' request to URL : " + url);
       System.out.println("Response Code : " + responseCode);
       System.out.println("Response Code : " + con.getResponseMessage());

       BufferedReader in = new BufferedReader(new  InputStreamReader(con.getInputStream()));
       String inputLine;
       StringBuffer response = new StringBuffer();
       while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
       }
       in.close();

       if( responseCode!=200 ){ // if any Error
         //throw new WebolisApiException( responseCode,  response.toString());
       }else{
       }
       return Response.ok( response.toString(),   MediaType.APPLICATION_JSON).build();
    }


}

这是我调用另一个 java Spring 控制器的 REST 方法。

 @RequestMapping( value="/po", method=RequestMethod.GET,params=  {"getPoForSrnConsReport"})  //,consumes="application/json" 
        @ResponseBody ModelMap getPoForSrnConsReport(HttpServletResponse response,
                                        @RequestParam(value = "pono" )   Integer poNo) throws Exception {
            ModelMap m = new ModelMap();
            PoService poService = new PoService();
            Po po = poService.getPo(poNo, poService.ALL_ITEMS , Boolean.FALSE);
            m.addAttribute("po",po);
            return m;
       }

在 PoService 中我抛出自定义异常“找不到 PO”此字符串在 REST 方法中不可用

标签: javarestspring-mvchttpurlconnection

解决方案


尝试打开与发送错误代码的服务器的连接将引发您需要捕获的异常。getInputStream()当您收到错误响应代码时,您也不能使用。您需要使用getErrorStream()

BufferedReader in = null;
try {
    in = new BufferedReader(new InputStreamReader(con.getInputStream()));
}
catch(IOException e) {
    // handle specific exceptions here
}

int responseCode = -1;
try {
    responseCode = con.getResponseCode();
}
catch(IOException e) {
    // handle specific exceptions here
}

// override the input if you got an error and an error stream is available
if (in==null && responseCode!=200 && con.getErrorStream() != null) {
    in = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}

推荐阅读