首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring REST控制器文件上传-请求方法'POST‘不受支持错误

Spring REST控制器文件上传-请求方法'POST‘不受支持错误
EN

Stack Overflow用户
提问于 2019-07-18 17:57:43
回答 3查看 92关注 0票数 0

我正在为一个web应用程序创建一个原型,其中一个函数应该允许某人上传一个包含一些额外信息的excel文件。信息旁边的文件被存储在一个对象中,该对象被序列化并存储。

我已经创建了upload方法,在尝试测试函数时,它抛出了"Request method 'POST‘not supported“白色标签错误页面。

我怀疑这可能是pom.xml的问题,但我不能完全确定。

代码语言:javascript
运行
复制
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>project</groupId>
    <artifactId>answers</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>MVC 1.0 Blank Project (from https://github.com/making/mvc-1.0-blank)</name>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.ozark</groupId>
            <artifactId>ozark</artifactId>
            <version>1.0.0-m02</version>
        </dependency>
                <!-- Swing exercise -->
        <dependency>
            <groupId>com.miglayout</groupId>
            <artifactId>miglayout</artifactId>
            <version>3.5.5</version>
        </dependency>

        <!-- Web exercise -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>1.3.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.3.6.RELEASE</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

下面是Controller类。我们将在一两天内转到Thymeleaf配置,此html目前仅用于测试目的。

代码语言:javascript
运行
复制
    @MultipartConfig
    @RestController
    @RequestMapping(value = "/Teacher", produces = "text/html;charset=UTF-8")
    public class Teacher {



        @GetMapping("")
        @ResponseBody
        TestController testcont;
        public String homePage(@RequestParam(value = "file", required = false) String name, HttpServletRequest request,
                HttpServletResponse response){

            StringBuilder sb = new StringBuilder();


            sb.append("<p> <a href='/Teacher/NewTest'>New Test upload</a></p>\n"
                    + "<p><a href='/SelectTest'>Select Test File</a> <button type='button'>Send Test</button></p>"
                    + "\n \n \n"
                    + "<p><a>Current Test for students:</a>\n <a href='/getCurrentTest'></a></p>"
                    );

            return sb.toString();
        }


        @GetMapping("/NewTest")
        @ResponseBody
        public String newTestUpload(HttpServletRequest request, HttpServletResponse response){
            StringBuilder sb = new StringBuilder();



            if(!request.getParameterNames().hasMoreElements()){
                sb.append("<p><form action='' method='post' enctype='multipart/form-data'>"
                        + "<label>Enter file</label><input type='file' name='file'>"
                        + "<button type='submit'>Upload</button></p>"

                        + "<p><form action='/testName'>Test Name: <input type='text' name='name' value=''></p>"

                        + "<p><form action='/addInfo'>Comment: <input type='text' comment='comment' value=''></p>"

                        + "<p>Answer 1: <input type='text' Answer='answer1' value=''></p>"

                        + "<p>Answer 2: <input type='text' Answer='answer2' value=''></p>"

                        + "</form>"

                        + "<a href='/Teacher'>Back</a>\n"
                        );
                return sb.toString();
            }
            else if(request.getParameter("file") != null && request.getParameter("name") != ""
                    && request.getParameter("comment") != "" && request.getParameter("answer1") != null
                    && request.getParameter("answer2") != null){

                try{
                    // Upload happens here
                    Part filePart = request.getPart("file");
                    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();
                    InputStream fileContent = filePart.getInputStream();

                    File testExcel = new File(fileName);
                    testExcel.createNewFile();

                    Files.copy(fileContent, Paths.get(testExcel.getName()), StandardCopyOption.REPLACE_EXISTING);


                    double ans1 = Double.parseDouble(request.getParameter("answer1"));
                    double ans2 = Double.parseDouble(request.getParameter("answer2"));

                    Test test = new Test(testExcel, request.getParameter("name"), 
                                        request.getParameter("comment"), ans1, ans2);

                    testcont.addTest(test);

                    sb.append("New test uploaded!<br/>\n<a href='/'>Back</a>\n");
                    return sb.toString();


                } catch (Exception e){
                    sb.append("<h1>Couldnt insert test</h1>");
                    response.setStatus(HttpServletResponse.SC_OK);
                    return sb.toString();
                }

            }
            else{
                sb.append("failed<br/>\n<a href='/'>Back</a>\n");
                response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                return sb.toString();
            }

        }

    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-18 18:03:34

从您发布的控制器代码中,您的两个端点都是GET。/Teacher :- @GetMapping /Teacher/新测试:- @GetMapping

您正在尝试发送到不支持POST方法的终结点,这就是为什么您会看到错误消息,指定不支持' POST‘方法。

票数 1
EN

Stack Overflow用户

发布于 2019-07-18 18:01:36

控制器中的两个方法都有@GetMapping注释,这意味着它们支持GET请求。您需要用@PostMapping替换一个(以支持POST请求)

票数 1
EN

Stack Overflow用户

发布于 2019-07-18 18:05:09

将您的方法更正为:

代码语言:javascript
运行
复制
@PostMapping
@RequestMapping("/NewTest")
public String newTestUpload(HttpServletRequest request, HttpServletResponse response) {

代码语言:javascript
运行
复制
@PostMapping(path = "/NewTest")
public String newTestUpload(HttpServletRequest request, HttpServletResponse response) {
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57091865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档