如何让杰克逊忽略非DTO对象

时间:2014-04-23 16:44:03

标签: java spring jersey jackson

我们最近从Sun Jersey实施升级到GlassFish Jersey 2.7。当我们这样做时,杰克逊开始尝试对我们的Domain对象进行deserilize。在我们的情况下,这不是我们想要的。我们有域设置,因此域对象永远不会通过Web服务直接发送出去。一切都转变为DTO,然后发送出去。所以基本上我们只需要打电话

return Response.ok(new SomeFooBarDTOObject(someFooBarDomainObject)).build()

这用于与之前版本的Jersey / Jackson一起使用。使用更新的代码,我们会收到如下错误:

Conflicting setter definitions for property "preferredItem": com.foo.domain.FooBar#setPreferredItem(1 params) vs com.foo.domain.FooBar#setPreferredItem(1 params)

即使我们从未尝试发送实际的域对象。我们如何告诉Jackson只查看实际通过Web服务接收或发送的对象。

这是引起问题的Web服务我已将其简化为此。如果我从方法参数中取出RestaurantItemDTO restaurantItemDTO它可以工作,但是如果我将它保留在那里则没有。

RestaurantItemDTO只在其字段中包含基类型。它引用域对象的唯一方法是通过构造函数参数,并且还有一个公共的无参数构造函数。所以它不是唯一的构造函数。

@Controller
@Path("/restaurant/restaurantItem")
public class RestaurantItemWebService {
    @PUT
    @Path("/ordersheets/{ordersheetId}/{locationId}/restaurantItems/{restaurantItemId}")
    @Produces(value = MediaType.APPLICATION_JSON)
    @Consumes(value = MediaType.APPLICATION_JSON)
    @Transactional
    @PreAuthorize("hasRole('" + PermissionNames.SOME_PERMISSION+ "')")
    public Response saveExistingRestaurantItem(@PathParam("ordersheetId") Long orderSheetID, @PathParam("restaurantItemId") Long restaurantItemID, RestaurantItemDTO restaurantItemDTO) {
        return Response.ok(restaurantItemDTO).build();
    }

1 个答案:

答案 0 :(得分:0)

好吧,我无法弄清楚杰克逊为什么会这样做,但我确实发现问题是我有一个引用域对象的DTO的构造函数,尽管杰克逊应该有从来没有调用过构造函数,因为有一个默认的公共无参数构造函数可用,它仍然试图映射域对象。我解决了这个问题,但在引用域对象的构造函数上使用@JsonIgnore。