标签: spring-restcontroller

Spring 4 AOP @Aspect没有触发@RestController

我创建了一个Aspect,它执行基本的id比较,以确保用户属于创建所请求实体的同一组.我已成功将我的方面附加到@Service方法,但它在服务层上没有意义,我需要将它附加到@RestController方法.当我尝试这样做时,一切似乎都很好,但我的Aspect从未触发,日志也是静默的.

的pom.xml

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.1.7.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

春天的背景

<context:annotation-config/>
<context:component-scan base-package="my.pkg"/>
<aop:aspectj-autoproxy/>
<aop:config proxy-target-class="true"/>
Run Code Online (Sandbox Code Playgroud)

方面

@Aspect
@Component
public class MyAspect {
    @Pointcut("within(@org.springframework.stereotype.Controller *)")
    public void controller() {}

@Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
    public void restController() {}

    @Pointcut("args(java.security.Principal,..)")
    public void principalArgPointcut() {}

    @Around("(controller() || restController()) && principalArgPointcut()")
    public Object validate(ProceedingJoinPoint point) throws Throwable {
        doValidationBefore();
        Object result = point.proceed();
        doValidationAfter();

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

其中"doValidationBefore()"和"doValidationAfter()"将在验证失败时抛出异常.

最后,我的RestController

@RestController
@RequestMapping("/my-path")
public class MyController {
    @RequestMapping(value = "/{entityId}", method = RequestMethod.GET)
    public @ResponseBody
    ResponseEntity<MyEntity> getEntityDetails(Principal principal, @PathVariable("entityId") …
Run Code Online (Sandbox Code Playgroud)

spring-mvc spring-aop spring-4 spring-restcontroller

9
推荐指数
1
解决办法
6340
查看次数

Spring MVC RestController范围

我有以下Spring控制器:

package hello;

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/test")
    public String test() {
        long val = counter.incrementAndGet();
        return String.valueOf(val);
    }
}
Run Code Online (Sandbox Code Playgroud)

每次我访问REST API时,它都会返回一个递增的值.我只是在学习Java,我想知道为什么它并不总是返回1,因为AtomicLong每次请求到来时都必须创建一个必须创建的新实例.

java spring spring-mvc spring-restcontroller

9
推荐指数
1
解决办法
7974
查看次数

使用Spring @RestController处理带有ZonedDateTime参数的HTTP GET

我正在创建一个端点,它将接收日期以在服务器端进行一些过滤.代码如下所示:

@RequestMapping(
        value = "/test",
        method = RequestMethod.GET,
        produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}
)
@ResponseStatus(HttpStatus.OK)
public TestSummaryModel getTestSummaryByDate(
        @RequestParam ZonedDateTime start,
        @RequestParam ZonedDateTime end) {

    return testService.getTestBetween(start, end);

}
Run Code Online (Sandbox Code Playgroud)

当我尝试调用我的端点时,我收到HTTP 400错误"客户端发送的请求在语法上是不正确的."

我尝试了不同的日期格式,但没有一个有效.我错过了什么吗?我读到了@DateTimeFormat,但即使我添加了它,也没有用.

@RequestParam @DateTimeFormat(pattern = "dd-MM-yyyy") ZonedDateTime start
Run Code Online (Sandbox Code Playgroud)

这是我正在做的请求的一个例子:

HTTP://主机/测试的API/V1 /测试总结/试验开始= 2015年9月9日和结束= 2015年9月9日

谢谢!

java spring spring-mvc spring-restcontroller

8
推荐指数
1
解决办法
5931
查看次数

Spring文件上传 - '所需的请求部分不存在'

我试图向我的控制器发送POST请求但不能传递任何类型的任何参数,除非我决定使用JSON.我的目标是将一个字符串和一个文件传递给我的控制器,但我一直收到Required request part 'xxx' is not present错误.

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("file") MultipartFile uploadfile){
        return ResponseEntity.ok().body(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不能在这里提交文件.同样,如果我尝试:

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("name") String name){
        return ResponseEntity.ok().body(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

同样的事我不能在这里得到名字.

我通过Postman发送请求,如以下屏幕截图所示:

邮差要求

邮差要求2

唯一的标头标签用于授权.我没有任何Content-Type标头,我试图添加multipart/form-data但没有帮助.

只有我可以传递String参数的方法是添加到URL.所以下面的http://localhost:8080/SearchBox/admin/config?name=test工作,但这不是我想要的.我想在Body部分中使用String和File参数.

我还通过CURL进行了测试:

curl -X POST -H "Authorization:Bearer myToken" -H "Content-Type:Multipart/form-data" http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -X POST -H "Authorization:Bearer myToken"http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -H "Authorization:Bearer myToken" -F file=@"/g123.conf" http://localhost:8080/SearchBox/admin/config
Run Code Online (Sandbox Code Playgroud)

注意: …

java rest spring postman spring-restcontroller

8
推荐指数
1
解决办法
2万
查看次数

Spring如何仅通过形式参数名匹配查询参数?

假设我有以下代码片段:

@RequestMapping(method = RequestMethod.GET)
public List<Article> getArticles(@RequestParam int offset,
                                 @RequestParam int limit) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

当参数名称未明确声明为注释参数时,Spring如何将HTTP查询参数与正确的形式参数匹配?

它是否假设形式参数名称始终存在于字节码中?

据我了解,并非总是如此.只有在以下情况下才能从字节码中检索形式参数名称:

a)类文件已使用-parameters javac选项编译

b)类文件已使用-g(或-g:vars)javac选项进行编译,该选项添加包含真实变量名称的调试信息(因为形式参数存储为方法的第一个局部变量)

java bytecode bytecode-manipulation spring-restcontroller

8
推荐指数
1
解决办法
488
查看次数

如何正确构建REST-API端点

我使用REST-API还是很新的。

我想要这样的东西

POST http://localhost/posts/ <--- PostsController.java
GET http://localhost/posts/{id} <--- PostsController.java
POST http://localhost/posts/{id}/comments <--- CommentsController.java
GET http://localhost/posts/{id}/comments <--- CommentsController.java
GET http://localhost/posts/{id}/comments/{id} <--- CommentsController.java
Run Code Online (Sandbox Code Playgroud)

以下控制器处理/posts和另一个控制器处理程序的位置/comments

PostsController.java

@RestController
@RequestMapping("/posts")
public class PostsController {
   // something
}
Run Code Online (Sandbox Code Playgroud)

CommentsController.java

@RestController
@RequestMapping("/comments")
public class CommentsController {
 //do something
}
Run Code Online (Sandbox Code Playgroud)

如何在拥有不同控制器的同时维护上述网址?

java rest spring spring-restcontroller

8
推荐指数
2
解决办法
306
查看次数

springdoc-openapi-ui + swagger 不理解 @PathVariable required = false 标志

我使用这个库来生成文档:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-ui</artifactId>
    <version>1.5.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我有这个控制器:

@RestController
public class TestController {

    @GetMapping("/test{hz}")
    public String test(@PathVariable(value = "hz", required = false) String hz) {
        return "test";
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到这个文档:

在此输入图像描述

为什么required = false不起作用?

我试过这个:

@RestController
public class TestController {

    @GetMapping("/test{hz}")
    public String test(
            @Parameter(description = "foo", required = false)
            @PathVariable(value = "hz", required = false) String hz) {
        return "test";
    }
}
Run Code Online (Sandbox Code Playgroud)

也不起作用

编辑:(@Helen 评论的答案)-我当然知道这一点:

@RestController
public class TestController {

    @GetMapping(value = {"/test", "/test{hz}"})
    public String test(
            @Parameter(description …
Run Code Online (Sandbox Code Playgroud)

spring swagger spring-restcontroller springdoc springdoc-openui

8
推荐指数
1
解决办法
5679
查看次数

如何在Spring中的Rest中上传时验证文件类型,大小?

我正在尝试使用spring和Rest实现文件上传.这就是我迄今为止所做的

@RestController
@RequestMapping("/rest/upload")
public class ProfileImageUploadController {

   @Autowired
   ImageValidator imageValidator;

   @RequestMapping(value="/{userId}/image", method=RequestMethod.POST)
   public @ResponseBody String handleFileUpload(
        @PathVariable("userId") Integer userId,
        @ModelAttribute("image") SingleImageFile image,
        BindingResult result){

       MultipartFile file = image.getFile();
       imageValidator.validate(file, result);
       if(!result.hasErrors()){
           String name = file.getOriginalFilename();
           try{
               file.transferTo(new File("/home/maclein/Desktop/"+name));
               return "You have successfully uploaded " + name + "!";
           }catch(Exception e){
               return "You have failed to upload " + name + " => " + e.getMessage();
           }
       } else {
           return result.getFieldErrors().toString();
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

这是我的ImageValidator

@Component
public class ImageValidator implements …
Run Code Online (Sandbox Code Playgroud)

java rest spring spring-mvc spring-restcontroller

7
推荐指数
1
解决办法
8068
查看次数

Resttemplate 和补丁,无效

我使用弹簧 1.4.3

我尝试调用网络服务

  @PatchMapping(value = "/members/{memberId}/card")
  public ResponseEntity updateMemberCardId(@PathVariable("memberId") Long memberId, @RequestBody String cardId) throws ResourceNotFoundException {
        memberService.updateMemberCardId(cardId, memberId);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
  }
Run Code Online (Sandbox Code Playgroud)

在我的申请中,

@Component
@Configuration
public class ClientRestConfig {

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder, @Value("${main.server.url}") String mainServerUrl, @Value("${commerce.username}") String commerceUsername, @Value("${commerce.password}") String commercePassword,  @Value("${connection.timeout}") int timeout) {
        return builder.setConnectTimeout(timeout).setReadTimeout(timeout).basicAuthorization(commerceUsername, commercePassword).rootUri(mainServerUrl).build();
    }

}
Run Code Online (Sandbox Code Playgroud)

在另一种方法中我做

String cardId = "123456789";

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<>(cardId, headers);

ResponseEntity responseEntity =  restTemplate.patchForObject("/rest/members/1/card", entity, ResponseEntity.class);
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

java.net.ProtocolException: Invalid HTTP …

resttemplate spring-boot spring-restcontroller

7
推荐指数
2
解决办法
8410
查看次数

Spring security 6.0 AuthorizationFilter - ShouldFilterAllDispatcherTypes 的默认值有问题

今天我花了几个小时来解决向 Spring security 6.0 的迁移问题,将已弃用的authorizeRequests()方法替换为authorizeHttpRequests(). 我了解到,在幕后,这意味着用安全链中的FilterSecurityInterceptor新内容替换旧内容。但是,如果您尝试注册数据库中已存在的用户 ,我未经身份验证的注册端点已经得到了一些意外结果,该端点使用 JPA 验证的请求正文,并且还以 BadRequest = 400 进行应答。AuthorizationFilter
@Valid

当转向 AuthorizationFilter 时,有效的注册请求仍然按预期工作,但错误情况(验证失败以及已存在的用户)均回复 Unauthorized = 401,这对于未经身份验证的端点来说是不可接受的...

我可以通过链接解决这个问题(最终!)

.shouldFilterAllDispatcherTypes(false)
Run Code Online (Sandbox Code Playgroud)

authorizeHttpRequests()

但现在我开始想知道,新的默认行为是否有意义......

相当不起眼的代码片段是:

  1. 控制器映射的调用,其中服务可以抛出@ResponseStatus(HttpStatus.BAD_REQUEST)带注释的UserAlreadyExistsException
@PostMapping("/api/register")
public ResponseEntity<Void> registerUser(@Valid @RequestBody UserDto userDto) {
    service.registerUser(mapper.toEntity(userDto));
    return ok().build();
}
Run Code Online (Sandbox Code Playgroud)
  1. SecurityFilterChain bean 的相关部分:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http,
                                               AuthenticationManager authenticationManager) throws Exception {
    http.authenticationManager(authenticationManager)
            //.authorizeRequests()  <-- deprecated, but working, using SecurityFilterInterceptor
            .authorizeHttpRequests()
            .shouldFilterAllDispatcherTypes(false) // without this line …
Run Code Online (Sandbox Code Playgroud)

authorization exception spring-security spring-boot spring-restcontroller

7
推荐指数
1
解决办法
2183
查看次数