【问题标题】:HTTP error code 405: tomcat Url mapping issueHTTP 错误代码 405:tomcat Url 映射问题
【发布时间】:2013-06-25 16:18:14
【问题描述】:

我在 POST 到我的 java HTTPServlet 时遇到问题。我从我的 tomcat 服务器收到“HTTP 状态 405 - 此 URL 不支持 HTTP 方法 GET”。当我调试 servlet 时,永远不会调用登录方法。我认为这是 tomcat 中的 url 映射问题......

web.xml

<servlet-mapping>
        <servlet-name>faxcom</servlet-name>
        <url-pattern>/faxcom/*</url-pattern>
    </servlet-mapping>

FaxcomService.java

@Path("/rest")
public class FaxcomService extends HttpServlet{
    private FAXCOM_x0020_ServiceLocator service;
    private FAXCOM_x0020_ServiceSoap port;

    @GET
    @Produces("application/json")
    public String testGet()
    {
        return "{ \"got here\":true }";
    }

    @POST
    @Path("/login")
    @Consumes("application/json")
//  @Produces("application/json")
    public Response login(LoginBean login)
    {
        ArrayList<ResultMessageBean> rm = new ArrayList<ResultMessageBean>(10); 
        try {
            service = new FAXCOM_x0020_ServiceLocator();
            service.setFAXCOM_x0020_ServiceSoapEndpointAddress("http://cd-faxserver/faxcom_ws/faxcomservice.asmx");
            service.setMaintainSession(true); // enable sessions support
            port = service.getFAXCOM_x0020_ServiceSoap();
            rm.add(new ResultMessageBean(port.logOn(
                    "\\\\CD-Faxserver\\FaxcomQ_API",
                    /* path to the queue */
                    login.getUserName(),
                    /* username */
                    login.getPassword(),
                    /* password */
                    login.getUserType()
                    /* 2 = user conf user */
                    )));
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        catch (ServiceException e) {
            e.printStackTrace();
        }
//      return rm; 
        return Response.status(201).entity(rm).build(); 
    }

    @POST
    @Path("/newFaxMessage")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public ArrayList<ResultMessageBean> newFaxMessage(FaxBean fax) {
        ArrayList<ResultMessageBean> rm = new ArrayList<ResultMessageBean>(); 
        try {
            rm.add(new ResultMessageBean(port.newFaxMessage(
                    fax.getPriority(),
                    /* priority: 0 - low, 1 - normal, 2 - high, 3 - urgent */
                    fax.getSendTime(),
                    /* send time */
                    /* "0.0" - immediate */
                    /* "1.0" - offpeak */
                    /* "9/14/2007 5:12:11 PM" - to set specific time */
                    fax.getResolution(),
                    /* resolution: 0 - low res, 1 - high res */
                    fax.getSubject(),
                    /* subject */
                    fax.getCoverpage(),
                    /* cover page: "" – default, “(none)� – no cover page */
                    fax.getMemo(),
                    /* memo */
                    fax.getSenderName(),
                    /* sender's name */
                    fax.getSenderFaxNumber(),
                    /* sender's fax */
                    fax.getRecipients().get(0).getName(),
                    /* recipient's name */
                    fax.getRecipients().get(0).getCompany(),
                    /* recipient's company */
                    fax.getRecipients().get(0).getFaxNumber(),
                    /* destination fax number */
                    fax.getRecipients().get(0).getVoiceNumber(),
                    /* recipient's phone number */
                    fax.getRecipients().get(0).getAccountNumber()
                    /* recipient's account number */
                    )));
            if (fax.getRecipients().size() > 1) {
                for (int i = 1; i < fax.getRecipients().size(); i++)
                    rm.addAll(addRecipient(fax.getRecipients().get(i)));
            }
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return rm; 
    }

}

Main.java

private static void main(String[] args)
    {
        try {
            URL url = new URL("https://andrew-vm/faxcom/rest/login");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setDoOutput(true); 
            conn.setRequestProperty("Content-Type", "application/json");

            FileInputStream jsonDemo = new FileInputStream("login.txt");

            OutputStream os = (OutputStream) conn.getOutputStream(); 
            os.write(IOUtils.toByteArray(jsonDemo));
            os.flush(); 

            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode());
            }

            BufferedReader br = new BufferedReader(new InputStreamReader( 
                    (conn.getInputStream())));

            String output;
            System.out.println("Output from Server .... \n");
            while ((output = br.readLine()) != null) {
                System.out.println(output);
            }
//          Don't want to disconnect - servletInstance will be destroyed
//          conn.disconnect();

        } catch (MalformedURLException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }
    }

我正在学习本教程:http://www.mkyong.com/webservices/jax-rs/restfull-java-client-with-java-net-url/

【问题讨论】:

  • get 方法有效吗?您使用哪个网址使其工作?
  • 顺便说一句,你说它写没有到 GET 的映射,但你正在使用 POST

标签: servlets jax-rs


【解决方案1】:

你犯了一个重大的概念错误。您将JAX-RS APIServlet API 混合在一起。使用@Path,您基本上是在注册一个 JAX-RS 网络服务。该类恰好是从HttpServlet 扩展而来的,但这并不能自动使它成为一个完全有价值的servlet。然后,您将其映射为 web.xml 中的独立 servlet(这样的实例将忽略所有与 JAX-RS 相关的注释,如 @Path 等等!),但您没有覆盖 servlet API 的 doGet() 方法符合 Servlet API 指南。这就解释了调用 servlet 的 URL 时找不到 GET 方法的 HTTP 405 错误。

我不确定你在尝试什么,但如果你想要一个 JAX-RS web 服务,而不是一个 servlet,那么你应该首先完成你找到的教程的this section。它描述了如何在web.xml 中配置和注册 JAX-RS Web 服务。然后,从您的 JAX-RS Web 服务类中完全删除 extends HttpServlet,并从 web.xml 中删除错误的映射。

还请阅读教程的指导文本,而不是仅仅盲目地复制粘贴代码 sn-ps 并更改例如类/包名称随处可见,而实际上并不了解您在做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2021-04-29
    • 2023-01-20
    • 2014-08-05
    相关资源
    最近更新 更多