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@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 返回空对象