首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有方法禁用Wildfly中的自动JSON修补程序?

是否有方法禁用Wildfly中的自动JSON修补程序?
EN

Stack Overflow用户
提问于 2019-11-26 12:49:23
回答 1查看 491关注 0票数 2

在Wildfly上使用JAX中的HTTP-PATCH参考资料(用14和18测试)时,会发生一些自动事件,使用GET调用相同的资源路径,从JSON补丁中应用更改并调用实际方法并得到结果。

代码语言:javascript
复制
$ curl localhost:8080/so/auto/Bob -H 'Content-Type: application/json-patch+json' -X PATCH -d '[{"op":"replace","path":"/age","value":24}]' -v
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> PATCH /so/auto/Bob HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
> Content-Type: application/json-patch+json
> Content-Length: 43
>
* upload completely sent off: 43 out of 43 bytes
< HTTP/1.1 200 OK
< Connection: keep-alive
< Transfer-Encoding: chunked
< Content-Type: application/json
< Date: Tue, 26 Nov 2019 12:45:51 GMT
<
* Connection #0 to host localhost left intact
{"age":24,"name":"Bob"}

是否有一种方法可以禁用此行为(使#patchManual工作)?

代码语言:javascript
复制
$ curl localhost:8080/so/manual/Bob -H 'Content-Type: application/json-patch+json' -X PATCH -d '[{"op":"replace","path":"/age","value":24}]' -v
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> PATCH /so/manual/Bob HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
> Content-Type: application/json-patch+json
> Content-Length: 43
>
* upload completely sent off: 43 out of 43 bytes
< HTTP/1.1 400 Bad Request
< Connection: keep-alive
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 41
< Date: Tue, 26 Nov 2019 12:42:58 GMT
<
* Connection #0 to host localhost left intact
not a json patch: {"name":"Bob","age":24}

复制问题的代码:

代码语言:javascript
复制
package so;

import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonPatch;
import javax.json.JsonStructure;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PATCH;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

@Path( "/" )
public class MyPatchResource
{
    public static class Data
    {
        public String name;
        public int    age;
    }

    @GET
    @Produces( MediaType.APPLICATION_JSON )
    @Path( "auto/{name}" )
    public Data read( @PathParam( "name" ) String name )
    {
        Data result = new Data();
        result.name = name;
        result.age = 42;
        return result;
    }

    @PATCH
    @Path( "auto/{name}" )
    @Consumes( MediaType.APPLICATION_JSON_PATCH_JSON )
    @Produces( MediaType.APPLICATION_JSON )
    public Data patchAuto( Data patched )
    {
        return patched;
    }

    @PATCH
    @Path( "manual/{name}" )
    @Consumes( MediaType.APPLICATION_JSON_PATCH_JSON )
    @Produces( MediaType.APPLICATION_JSON )
    public JsonObject patchManual( @PathParam( "name" ) String name, JsonStructure patch )
    {
        if ( !(patch instanceof JsonArray) )
        {
            throw new WebApplicationException( Response.status( Status.BAD_REQUEST )
                    .type( MediaType.TEXT_PLAIN )
                    .entity( "not a json patch: " + patch )
                    .build() );
        }

        JsonPatch jsonPatch = Json.createPatch( patch.asJsonArray() );
        JsonObject original = readManual( name );

        return jsonPatch.apply( original );
    }

    @GET
    @Path( "manual/{name}" )
    @Produces( MediaType.APPLICATION_JSON )
    public JsonObject readManual( @PathParam( "name" ) String name )
    {
        return Json.createObjectBuilder()
                .add( "name", name )
                .add( "age", 42 )
                .build();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-22 15:01:44

所以我找到了解决办法..。

1)定义自定义http方法

代码语言:javascript
复制
@Target( { ElementType.METHOD } )
@Retention( RetentionPolicy.RUNTIME )
@HttpMethod( "JSONPATCH" )
@Documented
public @interface JSONPATCH
{}

2)在业务资源中使用该方法。

代码语言:javascript
复制
-    @PATCH
+    @JSONPATCH
    @Path( "manual/{name}" )
    @Consumes( MediaType.APPLICATION_JSON_PATCH_JSON )
    @Produces( MediaType.APPLICATION_JSON )
    public JsonObject patchManual( @PathParam( "name" ) String name, JsonStructure patch )

3)创建预匹配的ContainerRequestFilter,将补丁请求移动到JSONPATCH

代码语言:javascript
复制
@Provider
@PreMatching
public class JsonPatchEnableFilter implements ContainerRequestFilter
{
    @Override
    public void filter( ContainerRequestContext ctx ) throws IOException
    {
        if ( ctx.getMethod().equals( HttpMethod.PATCH )
                && MediaType.APPLICATION_JSON_PATCH_JSON_TYPE.isCompatible( ctx.getMediaType() ) )
        {
            ctx.setMethod( "JSONPATCH" );
        }
    }
}

这将通过绕过过滤器完全禁用原始行为,可能通过向过滤器添加额外的逻辑来对过滤器进行调整。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59051361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档