无法使用 JpaRepository 在 SpringMVC 中解析 ResponseEntity

Posted

技术标签:

【中文标题】无法使用 JpaRepository 在 SpringMVC 中解析 ResponseEntity【英文标题】:Cannot resolve ResponseEntity in SpringMVC using JpaRepository 【发布时间】:2016-08-30 09:45:54 【问题描述】:

这是我的控制器:

package com.hodor.booking.controller;

import com.hodor.booking.jpa.domain.Vehicle;
import com.hodor.booking.service.VehicleService;
import com.wordnik.swagger.annotations.Api;
import org.apache.commons.lang.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/api/v1/vehicles")
@Api(value = "vehicles", description = "Vehicle resource endpoint")

public class VehicleController 

    private static final Logger log = LoggerFactory.getLogger(VehicleController.class);

    @Autowired
    private VehicleService vehicleService;

    @RequestMapping(method = RequestMethod.GET)
    public List<Vehicle> index() 
        log.debug("Getting all vehicles");
        return vehicleService.findAll();
    

    @RequestMapping(value="/save", method=RequestMethod.POST, consumes="application/json")

    @ResponseBody
    public Vehicle setVehicle(@RequestBody Vehicle vehicle) 
        log.debug("Inserting vehicle");

        if (vehicle.getLicensePlate() == null)
            return new ResponseEntity<Void>(HttpStatus.CONFLICT);
        

        return vehicleService.saveVehicle(vehicle);
    

我想在上面的 If-Guard 中实现的是,如果车辆对象没有 LicensePlate 成员,则发回相应的 HTTP 状态标头 CONFLICT 或其他内容。

我来自 Node 和 Express 背景,我习惯于设置我的标题、发送响应并完成它。但是在这种情况下(JPA)它似乎不起作用。有什么想法吗?

【问题讨论】:

【参考方案1】:

另一种方法是利用 Spring 的验证支持对 POJO 进行声明式添加验证。基本上,您向 Vehicle 类添加注释,例如:

public class Vehicle 
    @NotNull
    private LicensePlate licensePlate;

    // getters, setters

然后在控制器方法中添加@Valid 注释:

@ResponseBody
public Vehicle setVehicle(@RequestBody @Valid Vehicle vehicle) 
    log.debug("Inserting vehicle");
    return vehicleService.saveVehicle(vehicle);

如果验证失败,Spring 将返回 400 响应。

确保您的类路径上有 JSR-303/JSR-349 Bean 验证实现,例如 Hibernate Validator(它可以在没有 Hibernate 的 ORM 支持的情况下使用)。

更多信息可以在 Spring 参考文档的validation chapter 中找到。

【讨论】:

我现在正在使用来自此类“javax.validation.constraints.NotNull”的@NotNull 注释。如果 null 为真,则返回 500 服务器错误,Fair Enough 作为奖励,是否也有这样的注释? docs.oracle.com/javaee/7/api/javax/validation/constraints/…。认为我找到了它:@Future 注释 - ***.com/questions/11624532/…【参考方案2】:

您使用的是哪个版本的 Spring MVC?来自另一个帖子How to respond with HTTP 400 error in a Spring MVC @ResponseBody method returning String?。它指出 Spring MVC 4.1 及更高版本使用不同的语法。

【讨论】:

以上是关于无法使用 JpaRepository 在 SpringMVC 中解析 ResponseEntity的主要内容,如果未能解决你的问题,请参考以下文章

jparepository 无法解析为类型

JpaRepository 连接问题,无法通过登录找到用户

Spring Boot + JPA 多模块项目无法注入 JpaRepository 接口

JpaRepository findAll()获取嵌套对象

JPA - 如果已获取父项,则 JpaRepository 子记录具有父 ID 而不是实体记录 [重复]

将 @EmbeddedId 与 JpaRepository 一起使用