3 回答

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);
}
}
}

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);
}

TA貢獻1821條經驗 獲得超6個贊
如果OrdersPreviewDTO
嚴格來說是你的Order
類的一個子集,為什么不簡單地使用@JsonView
注解在你的控制器中自動創建一個簡單的視圖呢?例如,請參閱https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring。
如果您需要用于輸入和輸出的 DTO,還可以考慮使用http://mapstruct.org/
添加回答
舉報