我创建了一个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控制器:
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每次请求到来时都必须创建一个必须创建的新实例.
我正在创建一个端点,它将接收日期以在服务器端进行一些过滤.代码如下所示:
@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日
谢谢!
我试图向我的控制器发送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发送请求,如以下屏幕截图所示:
唯一的标头标签用于授权.我没有任何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)
注意: …
假设我有以下代码片段:
@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选项进行编译,该选项添加包含真实变量名称的调试信息(因为形式参数存储为方法的第一个局部变量)
我使用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)
如何在拥有不同控制器的同时维护上述网址?
我使用这个库来生成文档:
<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
我正在尝试使用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) 我使用弹簧 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 …
今天我花了几个小时来解决向 Spring security 6.0 的迁移问题,将已弃用的authorizeRequests()方法替换为authorizeHttpRequests(). 我了解到,在幕后,这意味着用安全链中的FilterSecurityInterceptor新内容替换旧内容。但是,如果您尝试注册数据库中已存在的用户
,我未经身份验证的注册端点已经得到了一些意外结果,该端点使用 JPA 验证的请求正文,并且还以 BadRequest = 400 进行应答。AuthorizationFilter@Valid
当转向 AuthorizationFilter 时,有效的注册请求仍然按预期工作,但错误情况(验证失败以及已存在的用户)均回复 Unauthorized = 401,这对于未经身份验证的端点来说是不可接受的...
我可以通过链接解决这个问题(最终!)
.shouldFilterAllDispatcherTypes(false)
Run Code Online (Sandbox Code Playgroud)
到authorizeHttpRequests()。
但现在我开始想知道,新的默认行为是否有意义......
相当不起眼的代码片段是:
@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)
@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
java ×6
spring ×6
spring-mvc ×4
rest ×3
spring-boot ×2
bytecode ×1
exception ×1
postman ×1
resttemplate ×1
spring-4 ×1
spring-aop ×1
springdoc ×1
swagger ×1