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/
添加回答
举报
