【问题标题】:Jersey Method not allowed 405泽西方法不允许 405
【发布时间】:2013-08-11 10:47:25
【问题描述】:

我是其他服务的新手。我正在尝试创建一个接受来自客户端的 json 字符串的服务。使用 JQuery 调用此服务时出现 405 错误。 下面是ws的Java代码:

@POST
@Path("logevent")
@Consumes(MediaType.APPLICATION_JSON)
public boolean logEvent(String obj)
{
  System.out.println(obj);
  return true;
}

@Path("getdata")
@GET
public String getData()
{
  return "Hello";
}

用于发布 JSON 的 jQuery 代码是:

var json ="{\"userName\":\"testtest\"}";
var json_data =  JSON.stringify(json);

$.ajax({
    type: "POST",
    url: "http://localhost:8080/log/log/logevent",
    // The key needs to match your method's input parameter (case-sensitive).
     data: json_data,
    contentType: "application/json",
    dataType: "json",
    success: function(data){alert(data);},
    failure: function(errMsg) {
        alert(errMsg);
    }

出了什么问题?该帖子不起作用,但是当我使用 URL http://<serverip>/log/log/getdata 点击获取时,我得到了响应。

【问题讨论】:

  • 感谢 Michal 纠正错字。
  • 类的@Path是什么? JAX-RS 是否将 /log/log/logevent 与方法 logEvent() 匹配?
  • 你的意思是它确实匹配吗?
  • 您在 jQuery 中使用 http://localhost:8080/,在浏览器中使用 <serverip>。两者都一样吗?

标签: java web-services rest jersey jax-rs


【解决方案1】:

JSON MessageBodyReaders 能够将 JSON 流解组为 JAXB bean(或 POJO),但不能解组为字符串。创建一个 JAXB bean,如:

@XmlRootElement
public class User {

    private String userName;

    public String getUserName() {
        return userName;
    }

    public void setUserName(final String userName) {
        this.userName = userName;
    }
}

并将您的 POST 资源方法更改为:

@POST
@Path("logevent")
@Consumes(MediaType.APPLICATION_JSON)
public boolean logEvent(User obj) {}

【讨论】:

  • 然后将 @ConsumesMediaType.APPLICATION_JSON 更改为 MediaType.TEXT_PLAIN 并将您的 ajax 请求中的 contentType 更改为 text/plain。但是您将在obj 中拥有{"userName":"testtest"} 字符串。
  • bingo...我也在做同样的事情,但它说不能使用内容类型
【解决方案2】:

首先确定路径是/log/log/logevent

然后尝试更改请求/响应类型:

您应该使用application/json;charset=UTF-8(W3C XHR 规范),而且您的 Web 服务不会使用 JSON 响应而是输出布尔值,也许您应该更改响应类型。

以 UTF-8 为例:

JAX-RS

@Consumes("application/json;charset=UTF-8")

jQuery

contentType:"application/json;charset=UTF-8"

【讨论】:

  • 感谢您的帮助,但这不起作用。我试过这个但得到了同样的错误。
  • 有趣的是我有一个可以正常工作的 get 方法:@Path("getdata") @GET public String getData() { return "Hello"; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2023-03-23
  • 2011-06-21
  • 2011-04-05
  • 2014-05-23
  • 2011-04-03
  • 1970-01-01
相关资源
最近更新 更多