【问题标题】:Spring REST Controller returns JSON with empty data [closed]Spring REST 控制器返回带有空数据的 JSON [关闭]
【发布时间】: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?

标签: java json spring spring-boot spring-web


【解决方案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 注释。
猜你喜欢
  • 2015-01-28
  • 2018-08-13
  • 2019-06-06
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多