【问题标题】:How to produce json response that consumes json object using spring and Hibernate如何使用spring和Hibernate生成消耗json对象的json响应
【发布时间】:2015-03-13 12:40:37
【问题描述】:

我收到 415 错误。 这是我用于获取 json 响应的映射

@RequestMapping(value="/details", method= RequestMethod.POST ,
        consumes= MediaType.APPLICATION_JSON_VALUE ,
        produces= MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<UserDetails> addUserDetails(@RequestBody 
                RegisterInput registerInput)throws ValidationException{

    if(registerInput==null || registerInput.getUserName()==null){
                throw new ValidationException("Input is not valid");
    }
    UserDetails userDetails=new UserDetails(registerInput.getUserName(),
                    registerInput.getFirstName(), registerInput.getLastName(), registerInput.getPassword());
    userDetailsService.addUserDetails(userDetails);
    return new ResponseEntity<UserDetails>(userDetails, HttpStatus.OK);
}

pom.xml

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.13</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.4.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.4</version>
</dependency>

帮助我了解如何获取 json 响应,因为它在我的情况下显示错误 415。 提前致谢

其中 UserDetails 是 POJO 类,RegisterInput 是存储输入并返回 json 对象。以下是我的pom。

【问题讨论】:

    标签: java json spring hibernate spring-mvc


    【解决方案1】:

    您可以重构您的方法,通过@ResponseBody 将响应直接返回到响应正文

       @RequestMapping(value="/details", method= RequestMethod.POST ,
                consumes= MediaType.APPLICATION_JSON_VALUE ,
                produces= MediaType.APPLICATION_JSON_VALUE)
       @ResponseBody public UserDetails addUserDetails(@RequestBody 
                                            RegisterInput registerInput)throws ValidationException{
    
            if(registerInput==null || registerInput.getUserName()==null){
               throw new ValidationException("Input is not valid");
             }
             UserDetails userDetails=new userDetails(registerInput.getUserName(),
                            registerInput.getFirstName(), registerInput.getLastName(), registerInput.getPassword());
              userDetailsService.addUserDetails(userDetails);
              return userDetails;
       }
    

    还要注意,只有在使用 spring 4 时才需要 jackson 2.x 依赖项

    jackson 1.9.x 仅当您使用 Spring 3.x.x

    【讨论】:

    • 发布你的 bean 的代码,有两个常见的阻碍转换的因素,缺少或错误的依赖关系,或者错误的 getter 和 setter 意义上的错误 POJO
    【解决方案2】:

    您需要将您的帖子数据设置为 json。我怀疑你发布的数据是错误的。 This post 也是使用 @Controller 和 @ResponseBody 的 Spring rest 的好例子

    【讨论】:

    • 我正在使用 Hibernate,我需要在其中访问数据库中的数据。所以我想动态使用存储在我的数据库中的 json 对象
    • 您仍然可以这样做,该示例只是演示,但您可以在该站点上看到使用休眠将对象存储到数据库的其他示例
    【解决方案3】:

    您可以使用@RestController(而不是经典的@Controller)注释您的控制器。

    这样,您告诉 Spring 使用您返回的对象作为响应的主体。

    确保您发送的AcceptContent-Type 标头都带有application/json,并且您发送的Json 格式正确。

    【讨论】:

    • 它仍然抛出同样的错误。错误 415,媒体不受支持
    • @Dilpreet 你在发送带有应用程序/json 的 Accept 标头吗?
    【解决方案4】:

    您可以通过设置获取 JSON 作为响应

    响应实体

    作为控制器类中方法的返回类型。您还可以通过创建 Map 添加额外的 json 键值对让我们看下面的示例;

    @DeleteMapping("/delete/{id}")
    public ResponseEntity<Object> deleteDepartment(@PathVariable Long id) throws NotFoundException {
    
    
        Optional<Department> department = this.departmentService.findADepartment(id);
        if (department == null)
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
    
        Map<String, String> stringStringMap = new HashMap<>();
        if (departmentService.deleteADepartment(id)) {
            stringStringMap.put("status", "success");
            stringStringMap.put("message", "successfully deleted");
            stringStringMap.put("code", "200");
            return ResponseEntity.status(HttpStatus.OK).
                    body(stringStringMap);
    
        } else {
            stringStringMap.put("status", "failed");
            stringStringMap.put("message", "not  deleted");
            stringStringMap.put("code", "404");
            return ResponseEntity.status(HttpStatus.NOT_FOUND).
                    body(stringStringMap);
    
        }
    
    }
    

    这里输入网址是

    http://localhost:8080/department/delete/7

    输出响应是

    {
    "code": "200",
    "message": "successfully deleted",
    "status": "success"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多