在这篇文章中,我将演示如何使用 Spring Boot 创建一个简单的 Web 服务。这个框架使得开发 Web 服务几乎毫不费力,只要适当的依赖关系就位。在此示例中,我将创建一个 Web 服务,该服务将从文件中读取当前温度,并通过 RESTful 端点将其提供给客户端。
Spring Initializr 帮助人们选择生产特定解决方案所需的依赖项。Initializr 可以在以下位置找到: https ://start.spring.io/
使用 Initializr 创建项目时要注意的第一件事是,可以使用多种不同的 JVM 语言(包括 Java、Kotlin 或 Groovy)开发 Spring Boot 应用程序。这是 Spring Boot 与主要关注 Java 语言的 Jakarta EE 不同的一个领域。还可以为他们的 Spring Boot 项目选择 Gradle 或 Maven。使用 Initialzr 创建项目的最乏味的部分之一可能是为项目选择合适的依赖项。原因是存在如此多的依赖项选项,可能需要一段时间才能了解哪些对特定解决方案最有用。这不是一件坏事……它只是需要随着时间的推移而学习的东西。
要开始使用,请在 Initializr 中选择以下选项:
项目:马文
语言:Java
春季启动:2.3.3
依赖项:Spring Web
项目元数据
– 组:org.demo
– 神器:poolservice
– 名称:池服务
– 包名:org.demo.poolservice
– 包装:战争
– 爪哇:11
选择这些选项后,单击“生成”以下载项目文件。下载后,在您喜欢的 IDE 中打开项目。在这种情况下,我将使用 Apache NetBeans 12。现在可以构建项目并将其部署到容器,例如 Payara 服务器。该项目已配置并准备好开始添加 RESTful 服务。以下代码显示了由 Initializr 创建的生成的 PoolserviceApplication 类,其中包含 @SpringBootApplication 注解。
package org.demo.poolservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class PoolserviceApplication {
public static void main(String[] args) {
SpringApplication.run(PoolserviceApplication.class, args);
}
}
@SpringBootApplication 注解是一个快捷注解,它结合了以下三个注解的默认功能:
由于应用程序是默认配置的,因此通过在同一个包中创建一个名为 HelloController 的类并将以下代码放入其中来生成一个新的 RESTful 服务:
package org.demo.poolservice;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Greetings from Spring Boot This is the main service!";
}
}
@RestController 注释通过结合传统的@Controller 和@ResponseBody 注释功能将类连接为RESTful Web 服务控制器。在此示例中,我使用请求根来提供响应,如 @RequestMapping 注释所示。一旦添加了这个控制器类并编译和重新部署了代码,就可以访问 URL
http://localhost:8080/poolservice 以显示消息:“来自 Spring Boot 的问候,这是主要服务!”。
是时候通过创建一个名为 TemperatureReader 的新类来添加从文本文件(由 Raspberry Pi 编写)中读取当前温度的功能了。通过使用 @Component 注释并指定引用该 bean 的名称,可以使此类成为上下文 bean。在这种情况下,“温度读取器”。该类的功能非常简单,因为它从格式为 (23.5, 78.3) 的文件中读取温度,并分别通过currentTemperatureC和currentTemperatureF访问它们。
package org.demo.poolservice;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import org.springframework.stereotype.Component;
@Component("temperatureReader")
public class TemperatureReader {
private String currentTemperatureF;
private String currentTemperatureC;
protected String readTemperatureFile() {
String temperatureFile = "/<>/temperature.txt";
System.out.println("Temperature File: " + temperatureFile);
java.nio.file.Path path = Paths.get(temperatureFile);
String currentTemperature = null;
try (BufferedReader reader = Files.newBufferedReader(path, Charset.forName("UTF-8"))) {
String currentLine = null;
while ((currentLine = reader.readLine()) != null) {//while there is content on the current line
currentTemperature = currentLine;
}
} catch (IOException ex) {
ex.printStackTrace(); //handle an exception here
}
return currentTemperature;
}
/**
* @return the currentTemperatureF
*/
public String getCurrentTemperatureF() {
String temp = readTemperatureFile();
currentTemperatureF = temp.substring(temp.indexOf(",") + 1, temp.lastIndexOf(")"));
return currentTemperatureF;
}
/**
* @param currentTemperatureF the currentTemperatureF to set
*/
public void setCurrentTemperatureF(String currentTemperatureF) {
this.currentTemperatureF = currentTemperatureF;
}
/**
* @return the currentTemperatureC
*/
public String getCurrentTemperatureC() {
String temp = readTemperatureFile();
currentTemperatureC = temp.substring(temp.indexOf("(") + 1, temp.lastIndexOf(","));
return currentTemperatureC;
}
/**
* @param currentTemperatureC the currentTemperatureC to set
*/
public void setCurrentTemperatureC(String currentTemperatureC) {
this.currentTemperatureC = currentTemperatureC;
}
}
最后,要通过 RESTFul 服务提供温度读数,请创建一个名为 TemperatureController 的控制器并使用 @RestController 对其进行注释。通过使用 @Autowired 注释私有 TemperatureReader 字段来注入 TemperatureReader。然后可以使用 bean 通过使用 TemperatureReader 字段来获取温度。服务的 URL 映射是通过 index() 方法上的 @RequestMapping(“/temperature”) 注释提供的,它将用于在相应的请求映射中提供温度。index() 方法中包含的功能非常少,因为它仅调用
temperatureReader.getCurrentTemperatureF() 方法以返回当前华氏温度。
package org.demo.poolservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TemperatureController {
@Autowired
private TemperatureReader temperatureReader;
@RequestMapping("/temperature")
public String index() {
return temperatureReader.getCurrentTemperatureF();
}
}
学习更多JAVA知识与技巧,关注与私信博主(学习)