HttpURLConnection.getInputStream()上的本地webserice上的FileNotFoundException

时间:2017-05-25 23:20:41

标签: java web-services httpurlconnection

首先,是的,在这个确切的前提下,SO上存在多个问题。但是没有一个答案对我有用,所以我会问我的具体问题。

我有一个本地运行的web服务。此Web服务有一个允许您尝试登录的方法。如果成功,它会返回用户信息。如果您没有,则会收到无效的用户对象。

@Path("/UserService")
public class UserService {  
   Dao dao = new Dao();  

   @POST
   @Consumes(MediaType.APPLICATION_XML)
   @Path("/login") 
   @Produces(MediaType.APPLICATION_XML) 
   public User login(final LoginBean params){
       //return new User();

       User u = new User();
       u.setEmail(params.email);
       u.setPassword(params.password);
      return dao.login(u);
   }
}

这种特定的方法在Postman中运行良好。我称之为,获得200响应,并将完整的用户对象作为xml。

但是当我从我的代码中调用它时,它会在行conn.getInputStream()上抛出一个FileNotFoundException;

public class UserDAO {

    public static User login(User user) {
        String uri = "http://192.168.2.22:8080/Roommanagement/rest/UserService/login";
        try {
            URL url = new URL(uri);

            HttpURLConnection conn= (HttpURLConnection) url.openConnection();           
            conn.setDoOutput( true );
            conn.setInstanceFollowRedirects( false );
            conn.setRequestMethod( "POST" );
            //conn.setRequestProperty("Accept", "application/xml");
            conn.setRequestProperty( "Content-Type", "application/xml"); 
            //conn.setRequestProperty( "charset", "utf-8");
            //conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
            conn.setUseCaches( false );

            JAXBContext jc = JAXBContext.newInstance(User.class);

            jc.createMarshaller().marshal(user, conn.getOutputStream());

            //XMLEncoder xmlE = new XMLEncoder(conn.getOutputStream());
            //xmlE.writeObject(user);
            //xmlE.close();

            JAXBContext jc = JAXBContext.newInstance(User.class);
            java.io.InputStream streamXML;
            streamXML = conn.getInputStream();
            User returnedUser =
            (User) jc.createUnmarshaller().unmarshal(streamXML);
            conn.disconnect();
            return returnedUser;

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JAXBException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return new User();
    }
}

你可以从注释掉的行中看到我尝试过的一些事情,但没有一件事有所不同。

我做错了什么?我认为服务本身很好,因为从Postman完成的所有手动调用都按预期工作。

3 个答案:

答案 0 :(得分:2)

我在这看到一个潜在的问题:
您的操作不包括LoginBean实例,但您提供了User实例:

public User login(final LoginBean params){

public static User login(User user) {
  ....
  jc.createMarshaller().marshal(user, conn.getOutputStream());

答案 1 :(得分:1)

很多事情都可能发生。

您要做的第一件事就是获取响应代码并对其进行测试。

con.getResponseCode();

在尝试转换为XML之前获取内容类型是一种很好的做法。只需用普通字符串打印即可。

根据收到的回复代码处理回复。这里有一些代码可以作为示例使用。

if ((200 <= con.getResponseCode() && con.getResponseCode() <= 299)) {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader((con.getInputStream())));
        String response = new String();
        for (String line; (line = bufferedReader.readLine()) != null; response += line);
        System.out.println(response);
    } else {
        System.out.println();
        Map<String, List<String>> map = con.getHeaderFields();
        for (Map.Entry<String, List<String>> entry : map.entrySet()) {
            if (entry.getKey() == null) {
                System.out.println(entry.getValue());
            } else {
                System.out.println(entry.getKey() + ":" + entry.getValue());
            }
        }
        System.out.println();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader((con.getErrorStream())));
        String response = new String();
        for (String line; (line = bufferedReader.readLine()) != null; response += line);
        System.out.println(response);
        throw new WebServiceException(response);
    }
}

答案 2 :(得分:0)

我认为您缺少发出实际HTTP请求的代码。您需要调用connect方法来发出实际请求。

conn.connect() 

其余的代码看起来很好。