带有 Jersey、DeclarativeLinking 和 @NotNull 的内存耗尽循环与 HTTP POST
Memory exhaustion loop with Jersey, DeclarativeLinking and @NotNull with HTTP POST
对于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等中的bug/defect,还是我的misconfiguration/coding错误? (我不接受客户端的错误,因为这将是面向互联网的任何旧垃圾都可以发送)
第二个问题(不确定这是不是错误的形式),我应该包括 @Valid
吗?
环境是 运行 Grizzly 2.3.28,Jersey 2.25.1,MOXy 2.7.1 & 测试客户端使用 Apache HttpComponents Fluent 4.5.5
这里的问题是由于超级 class 包含未使用 @XmlTransient
注释的私有字段。 DeclarativeLinking 功能愉快地读取了 ORMLite Dao
class 的所有私有字段,其中包含很多很多对象。这还包括导致循环的双向一对一和一对多关系。
对于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等中的bug/defect,还是我的misconfiguration/coding错误? (我不接受客户端的错误,因为这将是面向互联网的任何旧垃圾都可以发送)
第二个问题(不确定这是不是错误的形式),我应该包括 @Valid
吗?
环境是 运行 Grizzly 2.3.28,Jersey 2.25.1,MOXy 2.7.1 & 测试客户端使用 Apache HttpComponents Fluent 4.5.5
这里的问题是由于超级 class 包含未使用 @XmlTransient
注释的私有字段。 DeclarativeLinking 功能愉快地读取了 ORMLite Dao
class 的所有私有字段,其中包含很多很多对象。这还包括导致循环的双向一对一和一对多关系。