我正在尝试在线执行托管在 tomcat 服务器上的 Spring boot 应用程序。问题是当我尝试获取、删除或发布数据时,用户控制器会生成此消息。
{
"timestamp": "2021-01-24T06:45:42.144+00:00",
"status": 404,
"error": "Not Found",
"message": "",
"path": "/tool/api/v1/users"
}
奇怪的问题是,当我在本地运行服务器时 http://localhost:8080/api/v1/users
我得到数据
但是当我尝试托管 war 文件并访问端点时,http://31.134.12.356:9080/tool/api/v1/users
我最终遇到了上述错误。
我的用户控制器
@RequestMapping("/api/v1")
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@Autowired
private RoleRepository roleRepository;
@GetMapping("/users")
public Iterable<User> getAllUsers() {
return userRepository.findAll();
}
@GetMapping("/users/{id}")
public User getUserById(@PathVariable("id") String id) {
return userRepository.findById(id).get();
}
@GetMapping("/users/{username}")
public User getUserByUsername(@PathVariable("username") String username) {
return userRepository.findByUsername(username).get();
}
@PostMapping(value = "/users")
public ResponseEntity<Object> saveUser(@RequestBody SaveUserRequest userRequest) {
//save user details
User user = new User(userRequest.getUsername(),
userRequest.getDisplayName(), userRequest.getEmail(), userRequest.getIdentityProvider());
Set<String> strRoles = userRequest.getRole();
Set<Role> roles = new HashSet<>();
if (strRoles == null) {
Role userRole = roleRepository.findByName(ERole.ROLE_USER)
.orElseThrow(() -> new RuntimeException("Role is not found."));
roles.add(userRole);
} else {
strRoles.forEach(role -> {
switch (role) {
case "admin":
Role adminRole = roleRepository.findByName(ERole.ROLE_ADMIN)
.orElseThrow(() -> new RuntimeException("Role is not found."));
roles.add(adminRole);
break;
case "mod":
Role modRole = roleRepository.findByName(ERole.ROLE_MODERATOR)
.orElseThrow(() -> new RuntimeException("Role is not found."));
roles.add(modRole);
break;
default:
Role userRole = roleRepository.findByName(ERole.ROLE_USER)
.orElseThrow(() -> new RuntimeException("Role is not found."));
roles.add(userRole);
}
});
}
user.setRoles(roles);
user.setId(java.util.UUID.randomUUID().toString());
user.setLastLoggedOn(new Date());
userRepository.save(user);
return ResponseEntity.ok(user);
}
}
奇怪的问题是我有其他端点并且它们工作正常,用户 rest api 是找不到的。我在api中添加了工具,因为它是war文件的名称,我在tomcat上运行了多个war文件。
ServletInitializer
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MonitoringToolApplication.class);
}
}
主类
@SpringBootApplication
@ComponentScan({ "com.example.tool.demo.controller"})
@EntityScan(basePackages = "com.example.tool.demo.model")
public class MonitoringToolApplication {
public static void main(String[] args) {
SpringApplication.run(MonitoringToolApplication.class, args);
}
}
我的 pom 文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.tool</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>Example</name>
<description>example</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!-- <scope>provided</scope>-->
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.2.2.jre8</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Application.properties 文件
#Example Tool connection string
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=jdbc:sqlserver://localhost;databaseName=example_tools
spring.datasource.username=sa
spring.datasource.password= user2k!!__
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.SQLServer2012Dialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql = true
请帮我解决这个问题。非常感谢。
答案 0 :(得分:0)
在服务端部署项目时,排除pom.xml文件中嵌入的tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>