Spring REST 控制器返回带有空数据的 JSON [关闭]

Posted

技术标签:

【中文标题】Spring REST 控制器返回带有空数据的 JSON [关闭]【英文标题】:Spring REST Controller returns JSON with empty data [closed] 【发布时间】:2017-02-16 07:17:09 【问题描述】:

我有一个简单的 Spring Boot Web 应用程序。我正在尝试从服务器接收一些数据。控制器返回一个集合,但浏览器接收到空 JSON - 花括号的数量等于来自服务器的对象数量,但其内容为空。

@RestController
public class EmployeeController 

@Autowired
private EmployeeManagerImpl employeeManagerImpl;

    @RequestMapping(path="/employees", method = RequestMethod.GET)
    public Iterable<Employee> getAllEmployees() 
        Iterable<Employee> employeesIterable = employeeManagerImpl.getAllEmployees();
        return employeesIterable;
    

方法触发并且浏览器显示:

控制台中没有更多内容。有什么想法吗?

编辑: Employee.java

@Entity
public class Employee implements Serializable

    private static final long serialVersionUID = -1723798766434132067L;

    @Id
    @Getter @Setter 
    @GeneratedValue
    private Long id;

    @Getter @Setter
    @Column(name = "first_name")
    private String firstName;

    @Getter @Setter
    @Column(name = "last_name")
    private String lastName;

    @Getter @Setter
    private BigDecimal salary;

    public Employee()

    

【问题讨论】:

请在此处提供employeesIterable 我们至少需要看看 POJO 的代码。可能是您没有任何可序列化的字段。 使用 ResponseBody,返回类型为 public @ResponseBody Iterable getAllEmployees() @KaranVerma @RestController 注释已经解决了这个问题。 像往常一样,它是在我问你之后开始的。我删除了 lombok 注释并添加了常见的 getter 和 setter。现在我收到了我想要的。但为什么它不适用于 lombok? 【参考方案1】:

我认为你应该使用 Lombok 作为类级别而不是字段级别。

@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor    
public class Employee implements Serializable 

这可能会解决您的问题。

【讨论】:

我不知道我可以在课堂上使用它们。很好,我会使用它,但在这种情况下不会......没有任何改变。 它适用于数据。然后我用它涵盖的注释切换数据:ToString、EqualsAndHashCode、Getter、Setter 和 RequiredArgsConstructor。有效。然后我只留下了Getter和Setter。它也有效......我根本不明白。那么STS建设项目一定有什么问题吗? 你可以直接从控制台构建和运行吗? @Getter@Setter 可以替换为单个注解@Data 基本上,您的实体类中需要公共的 Getter 和 Setter。这就是我在这里看到的问题【参考方案2】:

项目中是否有将 JAVA 对象转换为 JSON 的转换器。如果没有,你需要。尝试在您的项目中使用 Jackson。

将 Jackson jar 导入项目后,调度程序 servlet 应具有以下内容:

    <beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <beans:property name="messageConverters">
            <beans:list>
                <beans:ref bean="jsonMessageConverter" />
            </beans:list>
        </beans:property>
    </beans:bean>

    <!-- Configure bean to convert JSON to POJO and vice versa -->
    <beans:bean id="jsonMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    </beans:bean>

【讨论】:

Spring Boot 默认使用 Jackson。他遇到的关于 Lombok 不生成 getter 的问题,因此字段没有序列化,因为 Jackson 会寻找 getter。 @nurgasemetey 这是真的。你正在写的这个默认配置,HARDI,感谢 Spring Boot,我免费获得。 lombok getter 有问题,我还没解决。 现在有什么解决办法吗?我只是坚持下去。【参考方案3】:

尝试在方法签名中将@ResponseBody 添加到您的 REST 方法的返回类型声明中。如果您使用的是标准 Spring Boot 启动项目,那么应该这样做。

【讨论】:

它不会改变任何东西。问题在于 lombok 注释 - 它们只是不起作用。但这是为什么呢? @RestController 自动为所有返回添加@ResponseBody 注释。

以上是关于Spring REST 控制器返回带有空数据的 JSON [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

带有 Kotlin 和 Spring BootPost 的 REST API 返回空对象

Spring rest json 发布空值

Spring REST 不返回对象的内容

Extjs 6 + Spring Rest:401 错误的空响应

PHP REST API 查询返回空正文

带有 RESTful 的 GraphQL 返回空响应