【问题标题】:How can I pass an Object from an AngularJS Service to Java using http POST JAX-RS如何使用 http POST JAX-RS 将 AngularJS 服务中的对象传递给 Java
【发布时间】:2015-05-25 11:13:51
【问题描述】:

所以我正在构建一个电子邮件客户端,它可以对 Google API 进行授权的 RESTful 调用(OAuth 2 和 JAX-RS)。

我已成功导入电子邮件和联系人。我现在想发送一封电子邮件。

我有一个控制器调用服务(成功)

app.controller('ComposeController', function($scope, $cookies, ComposeService) {

    //Some test data
    var email = $cookies.email;
    $scope.to = "********@yahoo.com";
    $scope.subject = "test";
    $scope.body = "test";

    $scope.compose = function() {

        //Create an email object
        $scope.newEmail = {
                'to' : $scope.to,
                'from' : email,
                'subject' : $scope.subject,
                'body' : $scope.body
        };

        //Parse to JSON
        var emailJSON = angular.toJson($scope.newEmail);

        //Make call to ComposeService
        var response = ComposeService.compose(emailJSON).success(function(jsonData) {

            response = jsonData;
            alert(response);
        });
    }
});

Service 然后调用 Java 类

app.factory('ComposeService', function($http) {

    var response = {};

    response.compose = function(newEmail) {

        return $http({

            method: 'POST',
            url: 'resources/composeMail/send',
            data: {
                newEmail : newEmail
            },
            headers: {'Content-Type':'application/json'}
        });
    }

    return response;
});

这是被调用的类

@Path("/composeMail")
public class Compose {

    @POST
    @Path("/send")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public String sendMessage(NewEmail newEmail) throws MessagingException,
            IOException {

        System.out.println("I am here");
    .....

这里是 NewEmail 对象

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class NewEmail {

    private String to;
    private String from;
    private String subject;
    private String body; 

    public NewEmail(String to, String from, String subject, String body) {
        this.to = to;
        this.from = from;
        this.subject = subject;
        this.body = body;
    }
......

Java 类没有被调用。我收到 400 响应(错误请求)。如果我从构造函数中删除“NewEmail newEmail”,则该类会被调用并且我会看到预期的输出。

谢谢。

【问题讨论】:

  • 我猜你在NewEmail 类中需要一个带有getter 和setter(遵循Java bean 命名约定)的默认(无参数)构造函数。您的反序列化器(默认情况下)可能不知道传递构造函数参数来创建对象
  • 您是否尝试过发送未包装的普通对象? IE。而不是:data: { newEmail : newEmail },,做data: newEmail
  • 这行得通。谢谢。

标签: java angularjs rest jax-rs angularjs-service


【解决方案1】:

乍一看,JS 代码看起来不错。不过,您需要在 JAX-RS 方面做一些工作。这是因为 JAX-RS 不知道如何在请求中的 JSON 与您的 NewEmail 类之间进行转换。

你有两个选择:

  1. 为您的NewEmail 类编写自定义Provider。参见例如this link
  2. 更改方法参数以接受 JSON 并在方法中进行转换。从长远来看,这可能不太理想。

【讨论】:

  • 如果没有提供者,就会出现 415 不支持的媒体类型。我的猜测是 OP 已经有一个像 Jackson 一样的提供者。在这种情况下,如果 JSON 不能被映射,因为它(默认情况下)不处理构造函数 arg 构造,只有带有 getter 和 setter 的默认构造函数。当它抛出一个映射异常时,该异常被映射到一个 400。你猜。但我很确定这就是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
相关资源
最近更新 更多