当前位置: 首页 > 面试题库 >

Spring POST接收具有空值的对象

宋经业
2023-03-14
问题内容

我有一个AngularJSWeb应用程序,看起来它正确地将JSON发送到Tomcat服务器,但是服务器接收到空值。这个问题没有帮助,因为我的属性名称已经是小写字母,这个问题也没有帮助,因为我已经有了@RequestBody符号。
编辑:正如评论中指出的那样,我实际上没有这种表示法。 我读错了。

这是有问题的服务器方法:

@PostMapping(path="/kind/add")
public @ResponseBody String addNewKind(Kind kind) throws Exception {
    if (kind.getName() == null) {
        throw new Exception("Name not found.");
    }
    kindRepository.save(kind);
    return "Saved";
}

这是它希望接收的Kind对象:

@Entity
public class Kind {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String name;
    @OneToMany(mappedBy="kind")
    private Set<Card> cards;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Card> getCards() {
        return cards;
    }

    public void setCards(Set<Card> cards) {
        this.cards = cards;
    }
}

这是发出请求的方法:

var uri = 'http://localhost:8080/catalog/api/kind/';

function create(name) {
    var deferred = $q.defer();
    var data = {
        'name': name
    };
    $http({
        method: 'POST',
        url: uri + 'add',
        data: angular.toJson(data),
        headers: {
            'Content-Type': 'application/json; charset=UTF-8'
        }
    }).then(function(response) {
        deferred.resolve(response.data);
    }).catch(function(error) {
        console.error('Error while adding kind');
        deferred.reject(error);
    });
    return deferred.promise;
}

这是发送到服务器的JSON:

{"name":"Something"}

注意:
我假设我可以不发送id或发送cards参数,因为它id是自动生成的,cards可以为空。但是,发送以下JSON时会得到相同的null结果:

{"id":0,"name":"Something","cards":[]}

这些是请求标头:

Accept:           application/json, text/plain, */*
Accept-Encoding:  gzip, deflate
Accept-Language:  en-US,en;q=0.5
Connection:       keep-alive
Content-Length:   20
Content-Type:     application/json; charset=UTF-8
Cookie:            __distillery=08c4ef1_752470a4-…ID=lr9remoqoi0ht13v1urq5lq8r7
Host:             localhost:8080
Referer:          http://localhost:8080/catalog/
User-Agent:       Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/57.0

这是我kind在调试模式下查看object参数时服务器收到的内容:

kind= Kind
    cards= null
    id= 0
    name= null

问题答案:

您需要在方法上使用@RequestBody批注。您的控制器不知道主体是什么,因此您发布的html" target="_blank">对象永远不会绑定(或永远不会“使它”)到方法的Kind参数。

@PostMapping(path="/kind/add")
public String addNewKind(@RequestBody Kind kind) throws Exception {
    if (kind.getName() == null) {
        throw new Exception("Name not found.");
    }
    kindRepository.save(kind);
    return "Saved";
}

如果您希望返回新的“种类”,则希望控制器方法如下所示:

@PostMapping(path="/kind/add")
public Kind addNewKind(@RequestBody Kind kind) throws Exception {
    if (kind.getName() == null) {
        throw new Exception("Name not found.");
    }
    return kindRepository.save(kind);
}

附带一提,我注意到您在写出JSON时正在使用单引号。由于您要使用转换数据angular.toJson(),因此您应该可以。如果您尝试通过直接发送JSON字符串进行交互,则通常无法使用。JSON不使用单引号。



 类似资料:
  • 我有一个AngularJS Web应用程序,它看起来像是正确地将JSON发送到Tomcat服务器,但是服务器接收空值。这个问题没有帮助,因为我的属性名称已经是小写的,这个问题没有帮助,因为我已经得到了符号。编辑:正如评论中指出的,我实际上没有这个符号。我看错了。 下面是有问题的服务器方法: 以下是它期望接收的Kind对象: 以下是发出请求的方法: 这是发送到服务器的JSON: 注意:我假设我可以不

  • 我正在编写一个SPRING控制器来管理一些实体,在尝试编辑现有对象时遇到了问题。 以下是生成问题的get/post映射: 类别类别如下: 当我试图编辑一个对象时,正如您在日志底部看到的,它直接来自DB,但当它来自时,字段为。 ajax调用是这样完成的: 我已经读过了,但是如果我把放到 即使我把属性。 我知道我可以通过另一次调用DB来获得旧数据,但我希望有一种最干净的方法 解决方案:我已经解决了编辑

  • 我正在使用一个可打包对象来传递一个意图。我的对象看起来是这样的 公共类配方实现Parcelable{private List Recipe=null;private List firedents=null;private String preparation; 我调试了这部分代码,我知道sendRecipe对象是实例化的,数据是正确的。所以我把这个东西放在意向性上,然后把它发送到下一个活动 在这个

  • 使用Apache camel 2.15.3创建了SOAP服务,一切正常,即使响应SOAP正文也是有效的。 骆驼2.15.3依赖于cxf 3.0.6 但是当我将cxf-core更新到3.1.3时,一切都很好,除了SOAP响应体是空的。 没有错误日志,服务器启动正常。 我是否缺少一些依赖项? POM。xml

  • 问题内容: 我们有一些代码根据其坐标之间的距离对地址列表进行排序。这是通过使用自定义比较器的collections.sort完成的。 但是,列表中有时不包含地址,这会导致NullPointerException。解决这个问题的最初想法是让比较器返回至少0个坐标为零的地址的距离。我担心这可能导致列表中“有效”元素的顺序损坏。 因此是否可以在比较器中为空数据返回“ 0”值,还是有一种更干净的方法来解决

  • 考虑这个简单的例子: 此代码将打印,但是,如果我对每个