内存耗尽循环使用Jersey,DeclarativeLinking和@NotNull使用HTTP POST

时间:2018-04-14 14:36:23

标签: java jersey jax-rs

对于POST方法,具有以下结构:

@Path("/auth")
@Produces(MediaType.APPLICATION_JSON)
@DenyAll
public class Auth {

    @POST
    @Path("/login")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.TEXT_PLAIN)
    @PermitAll
    public Response createLogin(
            @NotNull @FormParam("username") final String username,
            @NotNull @FormParam("password") final String password,
            @Context final UriInfo uriInfo,
            @Context final HttpHeaders httpHeaders
    ) {
    }

}

我收到以下错误(直到内存耗尽才重复)。

INFO: [failed to localize] warning.linkfilter.processing(org.glassfish.jersey.internal.util.collection.KeyComparatorLinkedHashMap$Entry)
java.lang.NullPointerException
    at org.glassfish.jersey.internal.util.collection.KeyComparatorHashMap$Entry.hashCode(KeyComparatorHashMap.java:752)
    at org.glassfish.jersey.internal.util.collection.KeyComparatorLinkedHashMap$Entry.hashCode(KeyComparatorLinkedHashMap.java:295)
    at java.util.HashMap.hash(Unknown Source)
    at java.util.HashMap.containsKey(Unknown Source)
    at java.util.HashSet.contains(Unknown Source)
    at org.glassfish.jersey.linking.FieldProcessor.processLinks(FieldProcessor.java:99)
    at org.glassfish.jersey.linking.FieldProcessor.processMember(FieldProcessor.java:180)

使用以下内容生成请求:

Request.Post(BASE + "auth/login").bodyForm(Form.form().build())

请注意空Form

使用以下方法实例化Grizzly服务器:

final ResourceConfig rc = new ResourceConfig().packages("blah")
                .register(DeclarativeLinkingFeature.class)
                .register(ValidationFeature.class)
                .register(RolesAllowedDynamicFeature.class);
  • 如果我删除@NotNull,则不会发生错误循环。
  • 如果我注释掉DeclarativeLinkingFeature.class错误循环未发生,即使使用@NotNull
  • @Path没有其他方法。

我的问题是:这是Jersey / Grizzly等中的错误/缺陷,还是我的错配/编码错误? (我不接受客户端的错误,因为这将是互联网面临的任何旧垃圾都可以发送)

第二个问题不确定这是不好的格式),我是否应该包括@Valid

环境正在运行Grizzly 2.3.28,Jersey 2.25.1,MOXy 2.7.1&测试客户端正在使用Apache HttpComponents Fluent 4.5.5

1 个答案:

答案 0 :(得分:0)

这里的问题是由于超类包含未使用@XmlTransient注释的私有字段。 DeclarativeLinking功能很高兴地读取了ORMLite Dao类的所有私有字段,其中包含许多很多对象。这也包括引起循环的双向一对一和一对多关系。