当前位置: 首页 > 知识库问答 >
问题:

当使用@RequestPart注释的方法调用Rest API时,Rest控制器的所有注入成员bean都为NULL

袁文景
2023-03-14

下面是我的Rest控制器代码:

package com.tripura.fileserver.controller;

import com.magic.fileserver.annotation.TrackTime;
import com.magic.fileserver.model.ResponseMessage;
import com.magic.fileserver.service.S3Factory;
import com.magic.fileserver.service.SequenceGeneratorService;
import com.magic.fileserver.service.StorageService;
import org.springframework.http.*;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.security.Principal;
import java.util.List;

@RestController
@RequestMapping(FileServerController.ROOT_MAPPING)
public class FileServerController {
    public static final String ROOT_MAPPING = "/api/fileserver";

    private final SequenceGeneratorService sequenceGeneratorService;
    private final StorageService storageService;
    private final S3Factory s3Factory;

    public FileServerController(SequenceGeneratorService sequenceGeneratorService, StorageService storageService, S3Factory s3Factory) {
        this.sequenceGeneratorService = sequenceGeneratorService;
        this.storageService = storageService;
        this.s3Factory = s3Factory;
    }

    @GetMapping(value = "/health/admin")
    @PreAuthorize("hasRole('ADMIN')")
    @TrackTime
    public ResponseEntity<?> checkRequestAdmin() {
        return new ResponseEntity<>("Hello admin", HttpStatus.OK);
    }
    @PostMapping(value = "/add/file", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    @PreAuthorize("hasRole('USER') or hasRole('CONSULTANT') or hasRole('ADMIN')")
    @TrackTime
    private ResponseEntity<ResponseMessage<String>> uploadFile(
            @RequestPart("files") List<MultipartFile> files) {
//        this.storageService.storeFileOnS3Bucket(files.get(0), image, fileName,
//                userName, category);
        ResponseMessage<String> responseMessage = new ResponseMessage<>();
        responseMessage.setMessage("File added: " + files.get(0).getOriginalFilename());

        return new ResponseEntity<>(responseMessage, HttpStatus.OK);
    }

问题是当我通过POSTMAN调用它时,如下所示:

    curl --location --request POST 'http://localhost:8096/api/fileserver/add/file' --form 'files=@"/G:/My Drive/Money_receipt.jpg"'

我可以看到方法内部的有效文件,但所有注入的bean都是NULL Debug在错误的方法中

我的环境:Java17(zulu17.28.13-ca-jdk17.0.0-win_x64)Spring Boot: 2.6.7

共有1个答案

田易安
2023-03-14

我终于找到了解决办法。这是一个愚蠢的错误,因为我将API方法uploadFile的访问修饰符声明为私有,如下所示:

private ResponseEntity<ResponseMessage<String>> uploadFile

将访问修饰符更改为公共后,解决了以下问题:

public ResponseEntity<ResponseMessage<String>> uploadFile
 类似资料:
  • 我已经使用Spring几十年了,但以前从未遇到过这个用例。 是否有方法注入所有带特定注释的bean,例如,所有带服务的bean或所有带自定义注释的bean? 我唯一的想法是注入上下文,获取所有bean并手动过滤。如果这是唯一的方法,Spring是否公开了一种递归扫描类层次结构以查找(元)注释的方法(因为大多数Spring注释都可以用作元注释)?

  • 问题内容: 有没有办法获取所有带有注释的Controller的列表?我想像这样使用它们: 谢谢! 问题答案: getBeansWithAnnotation() 如果您已使用控制器…对其进行注释: 然后

  • 我知道从中调用带注释的方法,前面已经讨论过了。 但是我不明白为什么当bean被覆盖时它就不起作用了。 我有一个遗留类,我不能修改。它是一个配置,同时也是一个业务bean。这是一个简化版本: 现在,调用返回而不是。 当配置被删除并且测试上下文的配置被设置为时,一切都能正常工作(结果为)。 在测试中注册bean有什么不同?

  • 使用Spring bean作为带有@cacheable注释的键

  • 我正在研究Dispatcher Servlet代码。在这里,我发现调度程序servlet使用HandlerMap来选择请求的处理程序。此外,Request estMappingHandlerMap用作HandlerMap的实现。现在,如果考虑的bean具有@Controller或@Request estMap注释,则isHandlerMethod of Request estMappingHand

  • 我有一个自定义的POJO,我正在其上使用JOOQ.fetchInto(TestClassDto.class)映射数据库记录。我的POJO中的大多数字段与数据库表的列完全相似。然而,有一些是不同的,因此,我添加了java持久性,并使用在我的POJO上显式映射这些列,如这里所述。 不幸的是,如果我在几个特定字段上使用@Column,这是行不通的。只有用列注释的字段被映射,其余字段被忽略并设置为Null