我使用弹簧 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
我正在运行带有嵌入式 tomcat 容器的 spring-boot 服务。
有没有办法通过通用应用程序属性或 EmbeddedServletContainerFactory来限制 HTTP PUT请求的大小?谢谢
我的一个控制器中的构造函数有一些问题。我尝试在构造函数中调用一项服务。该服务在 AbstractController 中自动装配,但我得到了一个空指针异常。
一个组件:
@Component
@RestController
@RequestMapping(value = "/test", ...)
public class AController extends AbstractController {
@Autowired
SomeService someService;
public AController(){
globalService.setClazz(Test.class);
}
....
Run Code Online (Sandbox Code Playgroud)
这里是抽象控制器:
public abstract class AbstractController<T> {
@Autowired
GlobalService globalService;
...
Run Code Online (Sandbox Code Playgroud)
这里例外。它被扔进去globalService.setClazz(Test.class);
Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.x.server.controller.AController]: Constructor threw exception; nested exception is java.lang.NullPointerException -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.3.1.RELEASE:run (default-cli) on project eza: An exception occurred while running. null
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) …Run Code Online (Sandbox Code Playgroud) 我正在使用弹簧。我想实现休息控制器将文件上传到服务器。我发现了很多这样的例子:
public ResponseEntity doSomething(@PathVariable String paramOne, @RequestParam(required = false, name="file") List<MultipartFile> attachments
) throws IOException {
//Some logic here
}
Run Code Online (Sandbox Code Playgroud)
然后我用邮递员测试它,我创建了一个“表单数据”类型的请求,添加婴儿车名称“文件”,选择类型文件,然后选择文件。它工作正常。
它创建一个 post 请求作为多部分请求。但出于某些原因,我不想使用多部分发布请求。所以我想通过在邮递员类型“二进制”中选择来上传文件。所以我的问题:
spring 能否以某种方式映射这种请求,以便我在处理程序方法中将输入文件作为参数?(我知道我可以获取 HttpServletRequest 并从中获取 InputStream,但是有更好的方法吗?)
通过这种方法,我只能得到输入流。传递文件名的好方法是什么?
这种方法的主要缺点是什么?
里面的参数起什么作用@RestController("/path/..")?它没有像@RequestMapping("/path/.."). 有什么不同?
@RestController("base-path")
Run Code Online (Sandbox Code Playgroud) 我试图将异常从我的休息控制器映射到具有主体的响应,并在中心位置执行此操作。
我已经尝试过这个:
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class RestErrorResponseExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleExceptionInternal(
Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
super.handleExceptionInternal(ex, body, headers, status, request);
return ResponseEntity.status(status).body(Error.from(status));
}
}
Run Code Online (Sandbox Code Playgroud)
问题是处理程序永远不会被触发。
@ExceptionHandler如果我在其余控制器中定义一个自定义方法,或者扩展具有 的东西@ExceptionHandler,那么一切都会很好,但这会引入一些糟糕的设计。
据我了解,Spring 将首先尝试在控制器中查找异常处理方法,然后检查已注册的处理程序。
我试图通过 WebMvcTest 验证行为,并且我得到的响应不是我期望的 Error 对象。
我有什么遗漏的吗?
我正在阅读 Spring 文档,发现从创建子类ResponseEntityExceptionHandler是处理异常的好方法。但是,我尝试以不同的方式处理异常,因为我需要BusinessExceptions从TechnicalExceptions.
创建了一个BusinessFault封装异常详细信息的 bean :
业务故障.java
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonInclude(value = Include.NON_NULL)
public class BusinessFault {
@JsonProperty(value = "category")
private final String CATEGORY = "Business Failure";
protected String type;
protected String code;
protected String reason;
protected String description;
protected String instruction;
public BusinessFault(String type, String code, String reason) {
this.type = type;
this.code = code;
this.reason = reason;
}
public BusinessFault(String type, String code, String reason, String description, …Run Code Online (Sandbox Code Playgroud) 我想在我的 Spring Boot Rest API 项目上实现过滤器,但是我的过滤器没有被调用。我为此添加了以下实现。
public class AutorizationFilter implements Filter{
Logger log = LoggerFactory.getLogger(AutorizationFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("**** Start ****");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
log.info("**** doFilter ****");
chain.doFilter(request, response);
}
@Override
public void destroy() {
log.info("**** end ****");
}}
Run Code Online (Sandbox Code Playgroud)
init和destroy方法正在工作,但doFilter方法未调用。
@Configuration
public class RestApiConfig {
@Bean
public FilterRegistrationBean<AutorizationFilter> filterRegistrationBean(){
FilterRegistrationBean<AutorizationFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new AutorizationFilter());
registrationBean.addUrlPatterns("/**");
return registrationBean; …Run Code Online (Sandbox Code Playgroud) 我有一个休息控制器类,如下所示,当用户对象无效时,它会抛出自定义异常。但是这些异常被 spring 框架包装,而不是由控制器建议中定义的特定异常处理程序处理。
@PostMapping
public ResponseEntity<String> process(
@PathVariable(User_id) String id,
@Valid @RequestBody(required = false) User user) {
}
Run Code Online (Sandbox Code Playgroud)
例如,Json 映射异常被包装为 org.springframework.http.converter.HttpMessageNotReadableException,并且不会通过控制器建议中的以下异常处理程序进行处理。
@ExceptionHandler(JsonMappingException.class)
public ResponseEntity<ErrorMessage> handleJsonMappingException(JsonMappingException e){
//process to return error message
}
Run Code Online (Sandbox Code Playgroud)
如何处理构建请求主体对象时抛出的这些特定异常?
实际收到的异常:
2018-09-16 23:14:07,671 ERROR [qtp1824013753-23] c.m.a.c.e.m.MyExceptionHandler [MyExceptionHandler.java:111] Unhandled exception : Type definition error: [simple type, class com.common.model.User]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.common.model.User`, problem: '123ghijk' is not a valid DeptName
at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.common.model.Employee["DeptName"])
org.springframework.http.converter.HttpMessageConversionException: Type definition …Run Code Online (Sandbox Code Playgroud) exception spring-mvc spring-boot spring-restcontroller spring-rest
spring-boot ×7
spring ×6
java ×4
exception ×3
spring-mvc ×3
spring-rest ×3
rest ×2
filter ×1
resttemplate ×1
tomcat ×1