在封闭作用域中定义的局部变量statusMessage在返回新对象时必须是final或有效的final



我在Spring Boot应用程序上有以下路由:

@SuppressWarnings("unused")
@GetMapping("/status")
public Object status() {
String statusMessage = "disconnected";
String error = null;
try {
Db db = new Db();
if (db.isConnected()) {
statusMessage = "ok";
}
} catch (Exception e) {
error = e.getMessage();
}
return new Object() {
public String project = applicationName;
public String version = buildVersion;
public String connection = statusMessage;
public String message = error;
};
}

但是public String connection = statusMessage;public String message = error;行有以下错误:

Local variable statusMessage defined in an enclosing scope must be final or effectively final

我怎么能解决这个问题,除了创建一个新的最终变量,接收任何errorstatusMessage之前在新对象中使用它?

注意:我返回一个新对象的原因是因为它是我能找到的最简单的方法来返回一个POJO,将其转换为JSON,而不必为每个路由返回创建一个类。

有很多方法可以解决这个问题,但在我看来,您不应该这样编码。

你可以使用AtomicReference来创建一个String对象的Reference。

AtomicReference<String> statusMessage = new AtomicReference<>();
AtomicReference<String> error = new AtomicReference<>();

statusMessage.set("Disconnected");
error.set(e.getMessage());

return new Object() {
public String connection = statusMessage.get();
public String message = error.get();
};

这将解决您的问题,但是返回一个原始对象将会给您带来更多的麻烦。为您的响应创建一个POJO,即使它是一个简单的DTO。这将使您能够提供更好的API文档,以及编写有效的单元测试,以及提供类型检查。

最终,创建一个实际的类而不是一个匿名对象是正确的选择。

最新更新