服务器返回HTTP响应代码:415不支持的媒体类型

时间:2017-03-29 08:23:25

标签: java json rest jersey

我有一个像下面这样的休息网络服务。

@POST
@Path("/startProcess")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_JSON)
public String startProcess(InputParams inputParams, @Context HttpServletRequest request, @Context HttpServletResponse response) {       
   ProjectBean projBean = new ProjectBean();
   Helper.loadProjectBean(inputParams, projBean);
   return "1";
}

现在我正在尝试使用以下主程序来使用它。

public static void main(String[] args) throws Exception {
    StringBuffer response = new StringBuffer();
    String taigaServiceUrl = "http://localhost:8181/restServer/rest/TestWebService/startProcess/";
    URL url = new URL(taigaServiceUrl);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("POST");
    conn.setDoOutput(true);
    conn.setRequestProperty("Content-Type", "application/json");
    String userpass = "admin" + ":" + "admin";
    String basicAuth = "Basic " + new String(new Base64().encode(userpass.getBytes()));
    conn.setRequestProperty("Authorization", basicAuth);
    InputParams inputParams = new InputParams();
    inputParams.setXXX("xxxx");
    inputParams.setYYYY("123456");
    inputParams.setZZZZ("ZZZZ");
    String json = new Gson().toJson(inputParams);
    DataOutputStream os = new DataOutputStream (conn.getOutputStream());
    os.write(json.getBytes());
    os.flush();
    BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
    String inputLine;
    while ((inputLine = br.readLine()) != null) {
        response.append(inputLine);
    }
    br.close();
}

但每次我都低于错误。

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 415 for URL: http://localhost:8181/restServer/rest/TestWebService/startProcess/
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at scm.controllers.Test.main(Test.java:64)

根据错误,媒体类型不受支持。在我的休息webservice中,我正在使用JSON,而在我的主程序中,我正在发送JSON。然后它在哪里破碎?

3 个答案:

答案 0 :(得分:0)

经过大量的调试后,我找到了问题的解决方案。我需要在classpath中添加以下jar。实际上,Jersey无法将JSON对象绑定到其他服务。

jackson-annotations-2.5.4.jar
jackson-core-2.5.4.jar
jackson-databind-2.5.4.jar
jackson-jaxrs-base-2.5.4.jar
jackson-jaxrs-json-provider-2.5.4.jar
jersey-entity-filtering-2.22.2.jar
jersey-media-json-jackson-2.22.2.jar

答案 1 :(得分:-2)

查看本指南:

我认为你需要定义一个json处理器:

https://www.nabisoft.com/tutorials/java-ee/producing-and-consuming-json-or-xml-in-java-rest-services-with-jersey-and-jackson

感谢。

答案 2 :(得分:-2)

这是@Produces和@Consumes的问题。 @Produces(MediaType.TEXT_PLAIN) @Consumes(MediaType.APPLICATION_JSON) 根据注释,您的端点接收JSON,结果将是TEXT。

但在您的客户端程序中,您已将内容类型称为json。 conn.setRequestProperty(“Content-Type”,“application / json”);

因此客户需要一个json,而不是。

将此更改为 conn.setRequestProperty(“Content-Type”,“text / plain”);

会起作用。