java - 无法将 JSON 数据发布到 Jersey Restful Web 服务

标签 java rest jersey

我正在尝试将 JSON 数据发送到我的 RESTful Web 服务。对于简单的 GET 类型,配置工作正常。仅问题在于 POST 类型。

我的角度代码

var app = angular.module('myApp', []);
app.controller('MyController', function($scope,$http) {
$scope.pushDataToServer = function() {
    $http({
        method: 'POST',         
        url: 'rest/Board/autoSave',
        headers: {'Content-Type': 'application/json'},
        data:'{"firstName":"Syed", "lastName":"Chennai"}',
        }).success(function (data){
            $scope.status=data;
        }).error(function(data, status, headers, config) {
            alert("error");
       });      
    };
});

我的Java代码

@Path("/Board")
public class BoardAutoSaveService {

    @POST
    @Path("/autoSave")
    @Consumes({MediaType.APPLICATION_JSON})
    @Produces({MediaType.TEXT_PLAIN})
    public String  autoSave(Message msg) throws Exception{
        System.out.println("Calling Autosave.");
        System.out.println("First Name = "+msg.getFirstName());
        System.out.println("Last Name  = "+msg.getLastName());
        return null;        
    }
}

消息类

package com.intu;
import java.util.Date;
public class Message {

private String firstName;

private String lastName;

private int age;

private Date date;

private String text;



public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public Date getDate() {
    return date;
}

public void setDate(Date date) {
    this.date = date;
}

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

}

Web.xml

      <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>iNTU-1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>   
  </welcome-file-list>
  <servlet>
      <servlet-name>Jersey RESTful Application</servlet-name>
      <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
       <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.dao</param-value>
       </init-param>
     </servlet>
   <servlet-mapping>
      <servlet-name>Jersey RESTful Application</servlet-name>
      <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
   </web-app>

我错过了什么吗?

错误是

SEVERE: A message body reader for Java class com.intu.Message, and Java type class com.intu.Message, and MIME media type application/json was not found.
The registered message body readers compatible with the MIME media type are:
application/json ->
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->

最佳答案

您只有默认的 Jersey JSON 提供程序,它需要模型类上的 @XmlRootElement 。您可以看到可用的提供程序,其中之一是 JSON**RootElement**Provider

com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App

此提供程序用于对用 @XmlRootElement 注释的类进行(反)序列化。

如果你有以下依赖

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>${jersey.version}</version>
</dependency>

然后它还应该引入 Jackson 提供程序,该提供程序不需要 @XmlRootElement,但您仍然需要将 Jersey 配置为使用 Jackson 而不是其默认提供程序。要配置它,您需要将其添加到您的 web.xml Jersey servlet 配置中,如 here 所示。

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

或者,如果您不使用 web.xml,请在 ResourceConfig 子类构造函数中添加以下内容

public class AppConfig extends PackagesResourceConfig{

    public AppConfig() {
        getProperties().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
    }
}

关于java - 无法将 JSON 数据发布到 Jersey Restful Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35497759/

相关文章:

java - 将 Jackson 与 Jersey 一起使用时,JsonTypeInfo 不会序列化

api - Firebase 通过 REST API PHP CURL 获取数据

java - 使用 ContainerRequestFilter 在 Jersey WebService 中自定义 @RolesAllowed 角色

java - JSyn,警报器声音使用振荡器馈送/控制/输入/菊花链到另一个振荡器和一个常数......并产生多个声音

java - 检查字段是否为空

rest - kubernetes 入口 TLS 验证和重定向问题

java - 如何检索 Jersey ContainerRequest 属性?

java - 如何从休息调用发送到 jsp 页面

java - Math.ceil 不舍入值

java - 如何在网站中创建即时通知系统