gpt4 book ai didi

java - 实现 Spring Security 后,Spring Boot ResponseBody 未序列化为 JSON

转载 作者:行者123 更新时间:2023-12-02 01:20:40 26 4
gpt4 key购买 nike

将 Spring Security 添加到我的 Spring Boot 项目后(没有真正配置它来执行任何操作),集成测试失败并出现以下错误:

java.lang.AssertionError: Response body was not valid JSON: <CustomResponse><content><id>dde6fd40-0ca3-482b-9a8e-b05fdab1b7b6</id><domain>somedomain.com</domain></content></CustomResponse>

在将 Spring Security 添加到项目之前,我的响应正文已适当序列化为 JSON。

我一直在搜索 Spring Security 文档,以了解任何响应主体和客户端之间发生的情况,但我无法弄清楚为什么 Spring Security 可能会干扰 RestController 对其进行序列化的方式。

这是我的 RestController 的示例:

@RestController
@RequestMapping("example-mapping")
@AllArgsConstructor
public class ExampleController {

private final ExampleService exampleService;

@GetMapping("/example")
public CustomResponse<ExampleDTO> checkOut(@RequestParam("domain") String domain) {

ExampleEntity result = exampleService.checkOut(domain);

return new CustomResponse<>(new ExampleDTO(result));
}
}

这是我的准系统,没有安全配置:

@Configuration
@AllArgsConstructor
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

private AuthenticationFilter authenticationFilter;

protected void configure(HttpSecurity http) throws Exception {
http
.addFilterBefore(authenticationFilter, BasicAuthenticationFilter.class)
.httpBasic().disable();
}
}

这是我的准系统,没有任何身份验证过滤器:

@Component
@AllArgsConstructor
public class AuthenticationFilter extends OncePerRequestFilter {

private ObjectMapper objectMapper; // injecting a global object mapper to read headers

@Override
protected void doFilterInternal(
HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {

// Read some headers, but currently not doing anything

filterChain.doFilter(request, response);
}
}

编辑:查看响应的 Content-Type 后,它的 application/xml (DUH)。所以问题是,身份验证过滤器将响应设置为 XML 的位置在哪里?

编辑:将 @GetMapping("/example") 更改为 @GetMapping(value = "/example", Produce = "application/json") 修复序列化问题。有没有办法让它们都默认生成 JSON?

最佳答案

当您使用 spring-web 设置项目时,JSON 已经是默认的内容类型。类路径中是否还有 spring-security 也没关系。我创建了一个具有最少依赖项的示例项目:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

我的 TestController 默认返回 JSON:

@RestController
public class TestController {

@GetMapping("/hello")
public Map<String, String> getGreeting() {
final HashMap<String, String> result = new HashMap<>();
result.put("value", "hello");
return result;
}

}
{
"value": "hello"
}

因此您的依赖项可能存在问题。

关于java - 实现 Spring Security 后,Spring Boot ResponseBody 未序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57628689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com