亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

杰克遜 ObjectMapper 休眠問題

杰克遜 ObjectMapper 休眠問題

收到一只叮咚 2022-01-19 09:11:33
我正在開發一個Spring Boot 2.0 / Java 8購物車在線應用程序。我Hibernate用作ORM框架。我有兩個實體,Order如下OrderDetail所示:@Entity@Table(name = "orders")public class Order extends AbstractEntityUuid {    @Column(name = "order_number", unique = true)    private String orderNumber;    @JsonBackReference    @ManyToOne(fetch = FetchType.LAZY)    @JoinColumn(name = "user_id", nullable = false)    private User user;    @Column(name = "total_amount")    private BigDecimal totalAmount = BigDecimal.ZERO;    @CreatedDate    @Column(name = "created_on", columnDefinition = "DATETIME", updatable = false)    protected LocalDateTime created;    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)    @JsonManagedReference    private Set<OrderDetail> items = new HashSet<>();    @OneToOne(fetch = FetchType.LAZY, orphanRemoval = true)    @JoinColumn(nullable = false, name = "card_details_id")    private CardDetails card;    @OneToOne(fetch = FetchType.LAZY, orphanRemoval = true)    @JoinColumn(nullable = false, name = "shipping_address_id")    private Address shippingAddress;    @OneToOne(fetch = FetchType.LAZY, orphanRemoval = true)    @JoinColumn(name = "billing_address_id")    private Address billingAddress;    //getters and setters}@Entity@Table(name = "order_detail")public class OrderDetail extends AbstractPersistable<Long> {    @Column(name = "quantity")    private Integer quantity;    @Column(name = "total_amount")    private BigDecimal totalAmount = BigDecimal.ZERO;    @ManyToOne(fetch = FetchType.LAZY)    @JoinColumn(name = "order_id", nullable = false)    @JsonBackReference    private Order order;    @OneToOne(fetch = FetchType.LAZY)    @JoinColumn(name = "product_id", nullable = false)    private Product product;    //getters and setters}
查看完整描述

3 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

簡短的回答是否定的,不要試圖那么聰明。手動創建 DTO 以控制任何延遲加載,然后在事務外的 DTO 上使用 Jackson。


長答案是肯定的,您可以覆蓋 MappingJackson2HttpMessageConverter 并控制從實體調用哪些字段。


@Configuration

public class MixInWebConfig extends WebMvcConfigurationSupport {


    @Bean

    public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter2() {

        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();

        ObjectMapper objectMapper = new ObjectMapper();

        objectMapper.addMixIn(DTO1.class, FooMixIn.class);

        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        jsonConverter.setObjectMapper(objectMapper);

        return jsonConverter;

    }


    @Override

    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        converters.add(customJackson2HttpMessageConverter2());

    }

}

然后


    @Override

    protected void processViews(SerializationConfig config, BeanSerializerBuilder builder) {

        super.processViews(config, builder);

        if (classes.contains(builder.getBeanDescription().getBeanClass())) {

            List<BeanPropertyWriter> originalWriters = builder.getProperties();

            List<BeanPropertyWriter> writers = new ArrayList<BeanPropertyWriter>();

            for (BeanPropertyWriter writer : originalWriters) {

                String propName = writer.getName();

                if (!fieldsToIgnore.contains(propName)) {

                    writers.add(writer);

                }

            }

            builder.setProperties(writers);

        }

    }

}


查看完整回答
反對 回復 2022-01-19
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

我只想補充一點,您可以直接從 JPQL 查詢返回 DTO,而不是使用 Jackson。它避免了從數據庫到對象的Order轉換以及從Order對象到OrdersPreviewDTO對象的另一次轉換。


例如,您需要更改存儲庫中的查詢來執行此操作。它會是這樣的:


public interface OrderRepository extends CrudRepository<Order, Long> {


    @Query("SELECT new OrdersPreviewDTO(o.order_number, o.created_on, o.total_amount)) FROM Order o WHERE o.user.email = ?1")

    List<OrdersPreviewDTO> findOrdersByUser(String email);

}


查看完整回答
反對 回復 2022-01-19
?
達令說

TA貢獻1821條經驗 獲得超6個贊

如果OrdersPreviewDTO嚴格來說是你的Order類的一個子集,為什么不簡單地使用@JsonView注解在你的控制器中自動創建一個簡單的視圖呢?例如,請參閱https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring。

如果您需要用于輸入和輸出的 DTO,還可以考慮使用http://mapstruct.org/


查看完整回答
反對 回復 2022-01-19
  • 3 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號