我们最近从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();
}
答案 0 :(得分:0)
好吧,我无法弄清楚杰克逊为什么会这样做,但我确实发现问题是我有一个引用域对象的DTO的构造函数,尽管杰克逊应该有从来没有调用过构造函数,因为有一个默认的公共无参数构造函数可用,它仍然试图映射域对象。我解决了这个问题,但在引用域对象的构造函数上使用@JsonIgnore。