标签: spring-restcontroller

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
查看次数

SpringBoot,限制 PUT 请求的请求大小

我正在运行带有嵌入式 tomcat 容器的 spring-boot 服务。

有没有办法通过通用应用程序属性或 EmbeddedServletContainerFactory来限制 HTTP PUT请求的大小?谢谢

tomcat spring-boot spring-restcontroller

6
推荐指数
1
解决办法
2151
查看次数

bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:

我的一个控制器中的构造函数有一些问题。我尝试在构造函数中调用一项服务。该服务在 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)

java spring spring-mvc spring-restcontroller

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

Spring REST 上传文件为二进制文件

我正在使用弹簧。我想实现休息控制器将文件上传到服务器。我发现了很多这样的例子:

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 请求作为多部分请求。但出于某些原因,我不想使用多部分发布请求。所以我想通过在邮递员类型“二进制”中选择来上传文件。所以我的问题:

  1. spring 能否以某种方式映射这种请求,以便我在处理程序方法中将输入文件作为参数?(我知道我可以获取 HttpServletRequest 并从中获取 InputStream,但是有更好的方法吗?)

  2. 通过这种方法,我只能得到输入流。传递文件名的好方法是什么?

  3. 这种方法的主要缺点是什么?

java rest spring spring-restcontroller spring-rest

6
推荐指数
0
解决办法
1009
查看次数

@RestController 和 @RequestMapping 注解所采用的参数之间的区别?

里面的参数起什么作用@RestController("/path/..")?它没有像@RequestMapping("/path/.."). 有什么不同?

@RestController("base-path")
Run Code Online (Sandbox Code Playgroud)

spring spring-boot spring-restcontroller

6
推荐指数
1
解决办法
7268
查看次数

Spring中自定义@ControllerAdvice用于异常处理

我试图将异常从我的休息控制器映射到具有主体的响应,并在中心位置执行此操作。

我已经尝试过这个:

@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 对象。

我有什么遗漏的吗?

java rest spring exception spring-restcontroller

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

Spring Boot中处理异常的正确方法

我正在阅读 Spring 文档,发现从创建子类ResponseEntityExceptionHandler是处理异常的好方法。但是,我尝试以不同的方式处理异常,因为我需要BusinessExceptionsTechnicalExceptions.

创建了一个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)

java spring spring-boot spring-restcontroller spring-rest

6
推荐指数
1
解决办法
8189
查看次数

Spring Boot Rest API 过滤器未调用

我想在我的 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)

initdestroy方法正在工作,但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 spring-mvc filter spring-boot spring-restcontroller

6
推荐指数
1
解决办法
6910
查看次数

spring boot 2中如何处理@Requestbody中对象抛出的异常

我有一个休息控制器类,如下所示,当用户对象无效时,它会抛出自定义异常。但是这些异常被 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

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