将json从角度发送到弹簧控制器时出错

Posted

技术标签:

【中文标题】将json从角度发送到弹簧控制器时出错【英文标题】:Error while sending json from angular to spring controller 【发布时间】:2018-11-12 11:49:15 【问题描述】:

我正在尝试在春季将 json 数据从 angularjs 服务发送到控制器。 但出现错误:

angular.js:10661 POST http://localhost:8080/shoping/product/add 500 (Internal Server Error)
product_service.js:35 Error while adding product
product_controller.js:30 productId: null, productName: "sdfv", productPrice: 43, description: "sfdv", imageUrl: "csd"

这是我在 angularJs 中的服务功能

function addProduct(product)
    var deferred = $q.defer();
    $http.post(REST_SERVICE_URI+"add", product)
        .then(
           function(response)
               deferred.resolve(response.data);
           ,
           function(errResponse)
               console.log('Error while adding product');
               deferred.reject(errResponse);
           

        );
    return deferred.promise;

这是我在spring控制器中的方法

@RestController
@RequestMapping("/product/")
public class ProductRestController 
@Autowired
ProductDao productDao; 
RequestMapping(value = "add", method= RequestMethod.POST, consumes="application/json")
    public ResponseEntity<Void> createProduct(@RequestBody Product product) 
        System.out.println("Creating Product " + product.getProductName());

        if (productDao.isProductExit(product)) 
            System.out.println("A Product with name " + product.getProductName() + " already exist");
            return new ResponseEntity<Void>(HttpStatus.CONFLICT);
        

       productDao.add(product);
       return new ResponseEntity<Void>(HttpStatus.CREATED);
    

我在角度服务中也有一个 $http.delete 方法

$http.delete(REST_SERVICE_URI+"delete/"+id)

还有一个错误说Syntax error on token ".", , expected

更新

Product.java

@Entity
@Table(name ="product")
public class Product implements Serializable
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="product_id")
private int productId;

@Column(name = "product_name")
private String productName;

@Column(name = "product_price")
private Float productPrice;

@Column(name = "description")
private String description;

@Column(name = "image_url")
private String imageUrl;
//getter and setter

更新:2

抱歉,当我尝试发送空 json 时发生了 NUllPointerException。 spring控制台没有报错

MainController.java

@Controller
@RequestMapping("/")
public class MainController 
@Autowired
UserDao userDao;


@RequestMapping(value =  "/", "/welcome**" , method = RequestMethod.GET)
public String defaultPage() 
    return "ProductManagement";


现在角度的错误是:

angular.js:10661 POST http://localhost:8080/shoping/product/add 404 (Not Found)

更新 3:

当我发出 get 请求而不是 post 时,它不会给出错误,而是在数据库中添加空值数据,并且它也不支持媒体类型 json。现在我认为问题很可能出在 URI 和 http 请求中。

这是我的项目 github 仓库:https://github.com/Bk073/Shopping

【问题讨论】:

你能分享更长的异常堆栈跟踪和完整的控制器类吗(跳过其余方法,但类上的路径映射会有所帮助) 避免使用explicit promise ant-pattern。当$http 已经返回一个承诺时,不需要新的$q.defer() 【参考方案1】:

从这么多信息(没有日志)看来,JDBC 一定有问题。如果一切都设置为默认值,那么我认为id 必须是auto increment 并发送null 而不捕获任何异常可能是原因...尝试从您的产品对象中省略id (json) 看看会发生什么...

【讨论】:

我从 Angular 中删除了 id 并再次尝试,现在它说“加载资源失败:服务器响应状态为 500(内部服务器错误)”“localhost:8080/shoping/product/添加:1' 您是否为写入权限正确定义了数据库权限?或者尝试通过以非 root 身份运行的 spring 以 root 身份编写?如果您可以添加那些返回 NullPointerException 的 MainController.java 行,最终会有所帮助 我发现 NullPointerException 发生在我只是尝试添加空数据时。而且我认为问题是 Spring 中的控制器不支持来自 Angular 的 URI。 请在这里找到我的答案。 ***.com/questions/50672453/…

以上是关于将json从角度发送到弹簧控制器时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 POST 中的 json 发送到 Web API 服务时出错

如何将JSonArray发送到弹簧控制器

使用 AFNetworking 2 将 Json 数组发送到服务器时出错

在 web 服务中发送消息时出错

将 JSON 从视图发送到控制器 ASP.NET MVC 会给出空值

将多个对象从Angular控制器POST到Web API 2