我正在处理我的应用程序的登录模块,当我提交`org.springframework.web.HttpRequestMethodNotSupportedException:登录表单时,我遇到了不支持‘POST’的请求方法.不确定如何继续.我也经历过类似的帖子,但这并没有帮助我解决这个问题.

Project Structure

Project Structure

login.html

<!--<div th:if="${param.error}">Invalid username and/or password.</div>-->
<form action="#" th:action="@{/validateLogin}" method="post" th:object="${userInfo}" class="row g-4">
   <div class="col-12">
      <label>Username<span class="text-danger">*</span></label>
      <div class="input-group">
         <div class="input-group-text"><i class="bi bi-person-fill"></i></div>
         <label>
         <input type="text" class="form-control" placeholder="Enter Username" th:field="*{username}">
         </label>
      </div>
   </div>
   <div class="col-12">
      <label>Password<span class="text-danger">*</span></label>
      <div class="input-group">
         <div class="input-group-text"><i class="bi bi-lock-fill"></i></div>
         <label>
         <input type="text" class="form-control" placeholder="Enter Password" th:field="*{password}">
         </label>
      </div>
   </div>
   <div class="col-sm-6">
      <div class="form-check">
         <input class="form-check-input" type="checkbox" id="inlineFormCheck">
         <label class="form-check-label" for="inlineFormCheck">Remember me</label>
      </div>
   </div>
   <div class="col-sm-6">
      <a href="#" class="float-end text-primary">Forgot Password?</a>
   </div>
   <div class="col-12">
      <button type="submit" class="btn btn-primary px-4 float-end mt-4">login</button>
   </div>
</form>

AuthenticationController

import in.sandeep.campusconvene.model.Users;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
public class AuthenticationController {

    @RequestMapping(path = "/validateLogin", method = RequestMethod.POST)
    public String validateLogin(@ModelAttribute Users userInfo){
        return userInfo.getUsername ();
    }
}

Exception Stacktrace

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Oct 13 09:15:25 IST 2023
There was an unexpected error (type=Method Not Allowed, status=405).
Method 'POST' is not supported.
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' is not supported
    at org.springframework.web.servlet.support.WebContentGenerator.checkRequest(WebContentGenerator.java:381)
    at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:164)
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:51)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:833)
 

我期待着从login.html检索usernamepassword,并对用户进行身份验证,并将其路由到适当的登录页面.

EDIT 1:

我已经更新了代码,如下所示,删除了AuthenticationController类,并创建了实现org.springframework.boot.web.servlet.error.ErrorControllerorg.springframework.web.servlet.config.annotation.WebMvcConfigurerRoutingController类.

import in.sandeep.campusconvene.model.Users;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@RestController
public class RoutingController implements ErrorController, WebMvcConfigurer {

    private static final String MAIN_APPLICATION_PATH = "/";
    private static final String LOGIN_VALIDATOR_PATH = "/validateLogin";
    private static final String ERROR_PATH = "/error";

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController(MAIN_APPLICATION_PATH)
                .setViewName("forward:/login.html");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }

    @RequestMapping(value = ERROR_PATH)
    public String handleError(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");
        return String.format("<html><body><h2>Error Page</h2><div>Status code: <b>%s</b></div>" +
                        "<div>Exception Message: <b>%s</b></div><body></html>",
                statusCode, exception == null ? "N/A" : exception.getMessage());
    }

    @RequestMapping(value = LOGIN_VALIDATOR_PATH, method = RequestMethod.POST)
    @ResponseStatus(value= HttpStatus.OK)
    public String validateLogin(@RequestBody Users users, Model model){
        System.out.println ("INSIDE validateLogin.....");
        return "LET'S AUTHENTICATE";
    }
}

现在,当我try 提交表单时,这是我在浏览器和控制台上分别遇到的情况.它甚至还没有达到validateLogin的方法.

我需要帮助来解决这个问题.

Error Page

2023-10-14T12:17:15.890+05:30 DEBUG 10130 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : POST "/", parameters={masked}
2023-10-14T12:17:15.891+05:30 DEBUG 10130 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped to ParameterizableViewController [view="forward:/login.html"]
2023-10-14T12:17:15.901+05:30  WARN 10130 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' is not supported]
2023-10-14T12:17:15.901+05:30 DEBUG 10130 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Completed 405 METHOD_NOT_ALLOWED
2023-10-14T12:17:15.902+05:30 DEBUG 10130 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for POST "/error", parameters={masked}
2023-10-14T12:17:15.904+05:30 DEBUG 10130 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to in.sandeep.campusconvene.controller.RoutingController#handleError(HttpServletRequest)
2023-10-14T12:17:15.927+05:30 DEBUG 10130 --- [nio-8080-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Using 'text/html', given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, */*;q=0.8, application/signed-exchange;v=b3;q=0.7] and supported [text/plain, */*, application/json, application/*+json]
2023-10-14T12:17:15.928+05:30 DEBUG 10130 --- [nio-8080-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Writing ["<html><body><h2>Error Page</h2><div>Status code: <b>null</b></div><div>Exception Message: <b>N/A</b> (truncated)..."]
2023-10-14T12:17:15.930+05:30 DEBUG 10130 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 405

EDIT 2:

用当前版本的validateLogin方法

@RequestMapping(value = LOGIN_VALIDATOR_PATH, method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public String validateLogin(HttpServletRequest request) {
  String username = request.getParameter("username");
  String password = request.getParameter("password");
  return username + password;
}

我现在在API Tester和控制台上得到了预期的响应,如下所示

2023-10-14T23:24:50.091+05:30 DEBUG 7663 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : POST "/validateLogin", parameters={masked}
2023-10-14T23:24:50.091+05:30 DEBUG 7663 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to in.sandeep.campusconvene.controller.RoutingController#validateLogin(HttpServletRequest)
2023-10-14T23:24:50.093+05:30 DEBUG 7663 --- [nio-8080-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Using 'text/plain', given [*/*] and supported [text/plain, */*, application/json, application/*+json]
2023-10-14T23:24:50.093+05:30 DEBUG 7663 --- [nio-8080-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Writing ["user1 foo"]
2023-10-14T23:24:50.094+05:30 DEBUG 7663 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Completed 200 OK

API Tester

但是,当我try 通过浏览器提交表单时,我仍然遇到405 METHOD_NOT_ALLOWED

2023-10-14T23:28:30.723+05:30 DEBUG 7663 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet        : POST "/", parameters={masked}
2023-10-14T23:28:30.724+05:30 DEBUG 7663 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped to ParameterizableViewController [view="forward:/login.html"]
2023-10-14T23:28:30.724+05:30  WARN 7663 --- [io-8080-exec-10] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' is not supported]
2023-10-14T23:28:30.724+05:30 DEBUG 7663 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet        : Completed 405 METHOD_NOT_ALLOWED
2023-10-14T23:28:30.725+05:30 DEBUG 7663 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for POST "/error", parameters={masked}
2023-10-14T23:28:30.725+05:30 DEBUG 7663 --- [io-8080-exec-10] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to in.sandeep.campusconvene.controller.RoutingController#handleError(HttpServletRequest)
2023-10-14T23:28:30.727+05:30 DEBUG 7663 --- [io-8080-exec-10] m.m.a.RequestResponseBodyMethodProcessor : Using 'text/html', given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, */*;q=0.8, application/signed-exchange;v=b3;q=0.7] and supported [text/plain, */*, application/json, application/*+json]
2023-10-14T23:28:30.728+05:30 DEBUG 7663 --- [io-8080-exec-10] m.m.a.RequestResponseBodyMethodProcessor : Writing ["<html><body><h2>Error Page</h2><div>Status code: <b>null</b></div><div>Exception Message: <b>N/A</b> (truncated)..."]
2023-10-14T23:28:30.729+05:30 DEBUG 7663 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 405

推荐答案

我找到了问题所在.我看到了多个问题.

不要通过将logic.html设置为/static来直接访问logic.html.它不是那样工作的.


Note:默认情况下,Thymeleaf仅判断/templates目录中的.html个文件.


首先,您的logic.html应该在/templates目录中,而不是/static目录中.

另一方面,您试图告诉胸腺叶,您将填充/绑定值在logic.html中的对象userInfo中,但您是从哪里获得该对象的.您没有在任何地方创建和传递该对象.

因此,您需要创建Users(userInfo)对象并将其从控制器传递到该页面.

项目 struct :

enter image description here

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>3.1.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo-thymleaf</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-thymleaf</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</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-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

我已经解决了你的login.html:

<!--<div th:if="${param.error}">Invalid username and/or password.</div>-->
<form th:action="@{/validateLogin}" method="post" th:object="${userInfo}" class="row g-4">
   <div class="col-12">
      <label>Username<span class="text-danger">*</span></label>
      <div class="input-group">
         <div class="input-group-text"><i class="bi bi-person-fill"></i></div>
         <label>
         <input type="text" class="form-control" placeholder="Enter Username" th:field="*{username}">
         </label>
      </div>
   </div>
   <div class="col-12">
      <label>Password<span class="text-danger">*</span></label>
      <div class="input-group">
         <div class="input-group-text"><i class="bi bi-lock-fill"></i></div>
         <label>
         <input type="text" class="form-control" placeholder="Enter Password" th:field="*{password}">
         </label>
      </div>
   </div>
   <div class="col-sm-6">
      <div class="form-check">
         <input class="form-check-input" type="checkbox" id="inlineFormCheck">
         <label class="form-check-label" for="inlineFormCheck">Remember me</label>
      </div>
   </div>
   <div class="col-sm-6">
      <a href="#" class="float-end text-primary">Forgot Password?</a>
   </div>
   <div class="col-12">
      <button type="submit" class="btn btn-primary px-4 float-end mt-4">login</button>
   </div>
</form>

<form>标签中go 掉不必要的action=#.

我已经根据您为测试提供的信息准备了一个用户类.

public class Users {
    
    private String username;
    private String password;

    // constructor, getter and setters
}

为了显示/validateLogin的成功,我也创造了一个success.html.

<body>
    <p>User Name: <strong th:text="${userInfo.username}"></strong></p>
    <p>Password: <strong th:text="${userInfo.password}"></strong></p>
</body>

将控制器更新为类似以下内容:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class AuthenticationController {
    
    @GetMapping("login-page")
    public ModelAndView loginPage(){
        ModelAndView view = new ModelAndView();
        view.setViewName("login");
        view.addObject("userInfo", new Users());
        return view;
    }

    @PostMapping("validateLogin")
    public ModelAndView validateLogin(@ModelAttribute Users userInfo){
       ModelAndView view = new ModelAndView();
       view.setViewName("success");
       view.addObject("userInfo", userInfo);
       return view;
    }
}

在解析/打开页面之前,您必须创建一个不带数据的Users模型对象/Bean,并通过ModelAndView通过胸腺叶将其传递给相应的login.html文件.

基本上,对于您在请求属性中通过th:object使用的Bean名称,它应该是一个普通的目标模型对象/Bean.

根据定义,th:object属性用于将 将表单的字段添加到模型对象.

简而言之,胸腺叶不知道userInfo将从哪里来,因为当您声明th:object="${userInfo}"时,不存在具有该名称的模型Bean/对象.

当您从登录页面传递字段值时,th:object试图查找绑定到BIND值的Spring容器中具有该名称的Bean,但它找不到,因为您没有传递任何值.

因此,这就是为什么会出现这个错误(您可能没有看到它).

Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'userInfo' available as request attribute

要解决这个问题,您必须首先提供一个Bean.这是我能解释的全部.

输出:

http://localhost:8080/login-page

enter image description here

点击提交按钮.它会呼叫http://localhost:8080/validateLogin

enter image description here

这会奏效的.

除非你想覆盖默认行为,否则你不需要为胸腺叶touch application.properties.

Update:

通过查看您的控制器代码here,这需要完全更正:

Change your controller code to this:

import in.sandeep.campusconvene.model.Users;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;

import java.io.IOException;

/**
 * The type RoutingController.
 *
 * @author sandeep
 * @version 1.0
 */
@RestController
public class RoutingController implements ErrorController {

    private static final String MAIN_APPLICATION_PATH = "/";
    private static final String LOGIN_VALIDATOR_PATH = "/validateLogin";
    private static final String ERROR_PATH = "/error";

    private ModelAndView modelAndView = new ModelAndView();

    /**
     * Gets Login Page.
     *
     * @return the Login Page
     */
    @RequestMapping(value = MAIN_APPLICATION_PATH, method = RequestMethod.GET)
    public ModelAndView getLoginPage() {
        modelAndView.setViewName("login");
        modelAndView.addObject("userInfo", new Users());
        return modelAndView;
    }

    /**
     * Handle Any Errors
     *
     * @return the Error Page
     */
    @RequestMapping(value = ERROR_PATH)
    public ModelAndView handleError() {
        modelAndView.setViewName("error_page");
        return modelAndView;
    }

    /**
     * Validate Login.
     *
     * @param request the request
     * @return the Home Page, if login is successful, else redirect to Login Page
     */
    @RequestMapping(value = LOGIN_VALIDATOR_PATH, method = RequestMethod.POST)
    @ResponseStatus(value= HttpStatus.OK)
    public ModelAndView validateLogin(@ModelAttribute Users userInfo){
        modelAndView.setViewName("welcomePage"); // REDIRECT TO USER HOME.
        modelAndView.addObject ("userInfo",userInfo);
        System.out.println ("ENTERED USERNAME => " + userInfo.getUsername ());
        System.out.println ("ENTERED PASSWORD => " + userInfo.getPassword ());
        return modelAndView;
    }
}

Fixes:

  • 我已经从所有使用的setViewName方法中删除了所有的.html个单词.只能使用modelAndView.setViewName()中的html文件的名称.例如:如果要显示index.html,则将modelAndView.setViewName("index");

  • / GET端点中设置modelAndView.addObject("userInfo", new Users())

Note:也请创建error_page.html.您的应用程序显示缺少错误.

Screenshot:

Welcome Back Page:

enter image description here

Login Page:

enter image description here

Java相关问答推荐

javafx getHostServices(). showDocument()调出Chrome而不是默认浏览器(Linux)

在FML中删除关键帧动画

我的scala文件失败了Scala.g4 ANTLR语法

强制Mockito返回null而不是emtpy list

Java .类参数不通过构造函数传递

给定Java枚举类,通过值查找枚举

DTO到实体,反之亦然,控制器和服务之间的哪一层应该处理转换?

Spark忽略Iceberg Nessie目录

Java编译器抛出可能未正确初始化的错误?

为什么Java编译器不区分不同类型的方法?

当Volatile关键字真的是必要的时候?

把一条整型短裤和两条短裤装成一条长的

由于在生成器模式中使用泛型,lambda表达式中的返回类型错误

Android Java:已设置但未读取SharedPreferences

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

如何处理两个几乎相同的XSD文件?

如何从命令行编译包中的所有类?

在Spring Boot中使用咖啡因进行缓存

如何判断元素计数并在流的中间抛出异常?

将天数添加到ZonedDateTime不会更改时间