【问题标题】:Supporting the "PATCH" verb - WSHttpHandler handleExchange gives WARNING: Cannot handle HTTP method: PATCH支持“PATCH”动词 - WSHttpHandler handleExchange 给出警告:无法处理 HTTP 方法:PATCH
【发布时间】:2019-07-30 15:17:40
【问题描述】:

我创建了一个使用 javax.xml.ws.Endpoint 来创建 REST 端点的类:

@WebServiceProvider
@ServiceMode(value = javax.xml.ws.Service.Mode.MESSAGE)
@BindingType(value = HTTPBinding.HTTP_BINDING)
public class SpecificRestAPI implements Provider<Source>
{
    // arg 0: url including port, e.g. "http://localhost:9902/specificrestapi"
    public static void main(String[] args)
    {
        String url = args[0];
        // Start
        Endpoint.publish(url, new SpecificRestAPI());       
    }

    @Resource
    private WebServiceContext wsContext;


    @Override
       public Source invoke(Source request)
       {
          if (wsContext == null)
             throw new RuntimeException("dependency injection failed on wsContext");
          MessageContext msgContext = wsContext.getMessageContext();
          switch (((String) msgContext.get(MessageContext.HTTP_REQUEST_METHOD)).toUpperCase().trim())
          {
             case "DELETE": 
                 return processDelete(msgContext);
             case "PATCH" :
                 return processPatch(msgContext);
'etc...

问题是,当我在 Eclipse 中运行此应用程序并使用 curlPATCH 时,通过以下命令向它发出请求:

curl -i -X PATCH http://localhost:9902/specificrestapi?do=action

我在 Eclipse 控制台中收到以下警告:

2019 年 7 月 30 日下午 3:39:15 com.sun.xml.internal.ws.transport.http.server.WSHttpHandler handleExchange 警告:无法处理 HTTP 方法:PATCH

以下是对我的curl 请求的回复:

curl: (52) 来自服务器的空回复

查看here,在WSHTTPHandler 类中,我可以看到问题出在哪里:

    private void handleExchange(HttpExchange msg) throws IOException {
    WSHTTPConnection con = new ServerConnectionImpl(adapter,msg);
    try {
        if (fineTraceEnabled) {
            LOGGER.log(Level.FINE, "Received HTTP request:{0}", msg.getRequestURI());
        }
        String method = msg.getRequestMethod();
        ' THIS IS THE PROBLEM - IT DOESN'T KNOW ABOUT PATCH!
        if(method.equals(GET_METHOD) || method.equals(POST_METHOD) || method.equals(HEAD_METHOD)
        || method.equals(PUT_METHOD) || method.equals(DELETE_METHOD)) {
            adapter.handle(con);
        } else {
            if (LOGGER.isLoggable(Level.WARNING)) {
                LOGGER.warning(HttpserverMessages.UNEXPECTED_HTTP_METHOD(method));
            }
        }
    } finally {
        msg.close();
    }
}

那么,我有什么选择? a) 我可以用我自己的自定义类替换 WSHTTPHandler 吗?如果是这样,我如何告诉我的Endpoint 我想使用它? 或 b) 是否有更新版本的 WSHttpHandler、更现代的替代方案或创建我可以使用的 Web 服务的不同方法来实现这一点?

【问题讨论】:

    标签: java web-services http-patch


    【解决方案1】:

    PATCH 此处不支持 - 应使用其他处理程序。

    【讨论】:

      猜你喜欢
      • 2016-08-12
      • 1970-01-01
      • 2013-07-20
      • 2017-06-20
      • 2017-11-09
      • 1970-01-01
      • 2014-09-29
      • 2015-01-05
      • 2020-04-23
      相关资源
      最近更新 更多