java - 如何在 Spring Boot 中发送请求范围 bean 作为响应

标签 java spring spring-boot spring-mvc requestscope

我需要发送也包含请求信息的响应。尝试使用以下代码但出现以下异常:

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class OrderResponse {
     private String discountDetails;
     private boolean confirmedStatus;
     private OrderDto orderDetails;
     private String shortMsg;
     private int status;
     //Getter & Setters
}

public class OrderDto {
     private int quantity;
     private String product;
     //Getters & Setters
}

Controller 和建议类:

@RestController
    @RequestMapping(value = "/orders")
    public class OrderController {
         @Autowired
         private OrderResponse orderResponse;
         ....
         @PostMapping(value = "/order/placeOrder")
         public ResponseEntity<OrderResponse> placeOrder(@RequestBody OrderDto orderDto){
           ....
           orderResponse.setOrderDetails(orderDto);//Adding request details to the response
           ....
           return new ResponseEntity<>(orderResponse, HttpStatus.OK); 
         }
    }

@RestControllerAdvice(assignableTypes = OrderController.class)
public class OrderExceptionHandler {
     @Autowired
     private OrderResponse orderResponse;

     @ExceptionHandler(value = DataAccessException.class)
     protected ResponseEntity<OrderResponse> constraintHandling(DataAccessException ex) {
        ....
        orderResponse.setShortMsg(shortMsg);
        orderResponse.setStatus(200);
        ....
        return new ResponseEntity<>(orderResponse, HttpStatus.OK);
     }
}

出现以下错误:

2020-05-10 18:39:34.362 ERROR 12620 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.springframework.aop.ClassFilter]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Direct self-reference leading to cycle (through reference chain: spring.test.jpa.controllers.OrderResponse$$EnhancerBySpringCGLIB$$5deecefd["advisors"]->org.springframework.aop.support.DefaultIntroductionAdvisor[0]->org.springframework.aop.support.DefaultIntroductionAdvisor["classFilter"])] with root cause

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Direct self-reference leading to cycle (through reference chain: spring.test.jpa.controllers.OrderResponse$$EnhancerBySpringCGLIB$$5deecefd["advisors"]->org.springframework.aop.support.DefaultIntroductionAdvisor[0]->org.springframework.aop.support.DefaultIntroductionAdvisor["classFilter"])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.10.3.jar:2.10.3]
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1191) ~[jackson-databind-2.10.3.jar:2.10.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter._handleSelfReference(BeanPropertyWriter.java:944) ~[jackson-databind-2.10.3.jar:2.10.3]
.....
.....

请帮忙解决这个问题,提前致谢!!

最佳答案

发生这种情况是因为 OrderDTOOrderResponse 都是序列化对象。这会触发来自 Jackson 的自引用错误。

您可以配置 ObjectMapper bean 来禁用此功能。

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, false);

关于java - 如何在 Spring Boot 中发送请求范围 bean 作为响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61713269/

相关文章:

java - 警告 - 类是原始类型。对泛型类型 Class<T> 的引用应该参数化

java - 如何在 PageFactory @FindBy 注释中使用属性文件值?

java - 如何使用 XML 配置使用 SimpleTriggerFactoryBean 将重复间隔设置为 24 小时

java - IntelliJ Spring Gradle "Run all tests"不工作(单个测试运行良好)

java - @Transactional 上的 MySQL 套接字超时行为

spring-boot - 如何显示通过哪个cassandra节点处理您的请求

java - Spring Boot 和 Mybatis 项目中存在多个数据源时出现 NoUniqueBeanDefinitionException

java - 从 Java 类调用 Groovy Closure - 它会编译吗?

Java LDAP - TCP RST 和套接字句柄泄漏

ajax - Spring 安全性 + Ajax session 超时问题