java - Spring mvc Restful - 错误的json回复格式

标签 java spring spring-mvc jpa spring-data-jpa

回复ajax请求时出现一个小问题。最初,我有最简单的 Restful 服务,基于 Spring Boot MVC

型号:

import javax.persistence.*; 
import java.util.*;

@Entity 
@Table(name = "testmodel")
public class TestModel 
{
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)//Postgresql sequence generator 
    private long id;

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

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


    //Constructor
    public TestModel()
    {   
    }

    //Id getter
    public long getId()
    {
        return this.id;
    }

    //Name getter-setter
    public String getName()
    {
        return this.name;
    }

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

    //Content getter-setter
    public String getContent()
    {
        return this.content;
    }

    public void setContent(String content)
    {
        this.content = content;
    }
}

模型的 DAO:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.*;

public interface TetsModelDAO extends JpaRepository<Samples, Long> 
{
    @Query("SELECT s FROM TestModel s WHERE LOWER(s.name) LIKE LOWER(:entry) ORDER BY s.name")
    List<TestModel> fetchByNameEntry(@Param("entry") String entry);
}

Controller :

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
@RequestMapping("/")
public class TestController 
{
    @Autowired
    private TetsModelDAO testmodel;

    @RequestMapping("/name")
    public List<TestModel> getDatasetsByNameEntry(@RequestParam("entry") String entry) 
    {
        return testmodel.fetchByNameEntry("%"+entry+"%");
    }
}

客户端ajax请求:

$.ajax(
{ 
  url : "/name?entry=", //get all records
  method: "GET"
})

这个示例完美运行 - 字符串化回复看起来像标准 json 结构:

{"id":"1", "name":"John", "content":"blablabla1"}
{"id":"2", "name":"Sam", "content":"blablabla2"}
{"id":"3", "name":"Ken", "content":"blablabla3"}

但是,当我尝试在 JPQL 查询中显式定义字段时(例如,仅获取 idname 字段),我在回复中得到错误的结果。

修改查询的 DAO(其他代码未更改):

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.*;

public interface TetsModelDAO extends JpaRepository<Samples, Long> 
{
   @Query("SELECT s.id, s.name FROM TestModel s WHERE LOWER(s.name) LIKE LOWER(:entry) ORDER BY s.name")
   List<TestModel> fetchByNameEntry(@Param("entry") String entry);
}

在这种情况下,回复如下所示:

1, John, 2, Sam, 3, Ken

如何优雅地解决这个问题(无需创建“帮助类”)?

最佳答案

您可以直接从存储库返回 DTO:

public interface TetsModelDAO extends JpaRepository<Samples, Long> 
{
   @Query("SELECT new mypackage.TestDto(s.id, s.name) FROM TestModel s WHERE LOWER(s.name) LIKE LOWER(:entry) ORDER BY s.name")
   List<TestDto> fetchByNameEntry(@Param("entry") String entry);
}

其中 TestDto 仅包含必填字段:

package mypackage;

public class TestDto {
  private final long id;
  private final String name;

  public TestDto(long id, String name) {
    this.id = id;
    this.name = name;
  }

  public long getId() {
    return id;
  }

  public String getName() {
    return name;
  }
}

关于java - Spring mvc Restful - 错误的json回复格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21364034/

相关文章:

java - Spring Hibernate Template 执行方法为 Oracle 上的计数查询返回什么对象类型?

java - Spring : Unsatisfied dependency

Spring 安全3.2 : @Autowire doesn't work with java configuration and custom AuthenticationProvider in Spring MVC application?

json - Gson 序列化 Spring beans

java - 删除并重新安装 Spring PetClinic 示例应用程序后,tomcat 7 服务器将无法启动

spring-mvc - SecurityContextHolder.getContext().getAuthentication().getPrincipal() 在 Controller 上为 null

java - postExecute 方法 URL 参数中的 Android 错误未添加到 mysql 数据库中

java - 给定字符集,如何将单个字符代码转换为 `char`?

java - 数据库树转java

java - 无法在 LibGDX 中设置 config.height 和 config.width