GVKun编程网logo

资源模型具有用于HTTP方法GET的模棱两可(子)资源方法和由“ @Consumes”和“ @Produces”注释定义的输入mime类型

14

在这里,我们将给大家分享关于资源模型具有用于HTTP方法GET的模棱两可的知识,让您更了解子资源方法和由“@Consumes”和“@Produces”注释定义的输入mime类型的本质,同时也会涉及到如

在这里,我们将给大家分享关于资源模型具有用于HTTP方法GET的模棱两可的知识,让您更了解子资源方法和由“ @Consumes”和“ @Produces”注释定义的输入mime类型的本质,同时也会涉及到如何更有效地Angular HttpPromise:`success` /`error`方法和`then`的参数之间的区别、Angular HttpPromise:`success`/`error` 方法和`then` 的参数之间的区别、c# – Urlmon.dll中具有更多MIME类型的FindMimeFromData方法的替代方法、C# 一个简易的Producer-Consumer工具类的内容。

本文目录一览:

资源模型具有用于HTTP方法GET的模棱两可(子)资源方法和由“ @Consumes”和“ @Produces”注释定义的输入mime类型

资源模型具有用于HTTP方法GET的模棱两可(子)资源方法和由“ @Consumes”和“ @Produces”注释定义的输入mime类型

以下内容具有不同的URL时,如何产生此错误?

@Path("/job/{empId}/empProfile")public EmpProfileResource delegateToEventProfileResource() {    EmpProfileResource resource = new EmpProfileResource();    locator.inject(resource);    return resource;}@Path("/job/{empId}/empTask")public EmpTaskResource getClientLevelAttendees(@PathParam("clientId") long clientId){    EmpTaskResource resource = new EmpTaskResource (empId);    locator.inject(resource);    return resource;}@Path("/")public class EmpTaskResource{}@Path("/")public class EmpProfileResource{}

是的,它们都是GET并产生相同的,所以?

@GET@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })

错误:

[[FATAL]资源模型具有用于HTTP方法GET的模棱两可(子)资源方法,并且由Java方法public
javax.ws.rs.core.Response中的“ @Consumes”和“
@Produces”注释定义的输入mime类型com.EmpTaskResource.getEmpTasks(java.time.LocalDate,java.time.LocalDate,java.lang.String)和公共javax.ws.rs.core.Response
com.EmpProfileResource.getEmpProfiles(long,java.lang.String)在匹配正则表达式/。这两种方法产生并使用完全相同的mime类型,因此它们作为资源方法的调用将始终失败。

答案1

小编典典

@Path("/")从子资源类中删除。子资源类不需要它们。如果有它们,则将它们添加为根资源类(如果您正在扫描带@Path注释的类)。这就是问题所在。您没有显示子资源类的方法,但是由于它们具有相同的根路径,因此我可以想象问题是由某些重叠的方法引起的。因此,只需删除@Path("/")on子资源类,就可以了。

Angular HttpPromise:`success` /`error`方法和`then`的参数之间的区别

Angular HttpPromise:`success` /`error`方法和`then`的参数之间的区别

根据AngularJS doc,调用$http返回以下内容:

返回带有标准 then* 方法和两个http特定方法的 promise 对象: successerror 。所述
然后 方法有两个参数一 成功 以及 错误 回调将与响应对象被调用。的 成功错误 的方法采取一个参数-
一当请求成功或失败分别将被调用的函数。传递给这些函数的参数是传递给then方法的响应对象的结构化表示。
*


除了response在一种情况下对象被破坏的事实之外,我没有得到

  • 成功/错误回调作为参数传递 promise.then
  • 回调作为promise 的promise.success/ promise.error方法的参数传递

有没有?传递看似相同的回调的这两种不同方式的意义何在?

答案1

小编典典

注意: 这个答案实际上是不正确的。正如下面的评论所指出的那样, success()确实返回了原始的诺言。 我不会改变 并留给OP进行编辑。


两者之间的主要区别在于,.then()调用返回一个promise(由回调返回的值来解决),而.success()注册回调是一种更传统的方式,并且不返回promise。

基于承诺的回调(.then())可轻松实现承诺链(进行一次呼叫,解释结果, 然后再 进行一次呼叫,解释结果,再进行一次呼叫等)。

.success()当您不需要链接调用或不需要使用promise API(例如,在路由中)时,该方法是一种简化的便捷方法。

简而言之:

  • .then() -promise API的全部功能,但更详细
  • .success() -不返回承诺,但提供更方便的语法

Angular HttpPromise:`success`/`error` 方法和`then` 的参数之间的区别

Angular HttpPromise:`success`/`error` 方法和`then` 的参数之间的区别

根据AngularJS doc,调用$http返回以下内容:

返回一个带有标准 then* 方法和两个 http 特定方法的 promise对象: successerror
then 方法接受两个参数,一个成功 一个 错误 回调,它们将被一个响应对象调用。 成功错误
方法采用单个参数 - 分别在请求成功或失败时调用的函数。传递给这些函数的参数是传递给 then 方法的响应对象的解构表示。
*


除了response对象在一种情况下被解构的事实之外,我没有得到两者之间的区别

  • 传递的成功/错误回调作为参数传递promise.then
  • 作为promise的promise.success/方法的参数传递的回调promise.error

有没有?这两种传递看似相同的回调的不同方式有什么意义?

c# – Urlmon.dll中具有更多MIME类型的FindMimeFromData方法的替代方法

c# – Urlmon.dll中具有更多MIME类型的FindMimeFromData方法的替代方法

通过 Windows DLL Urlmon.dll可访问的 FindMimeFromData方法能够确定存储在内存中的给定数据的MIME类型,考虑到存储此类数据的字节数组的前256个字节.

但是在阅读了它的文档之后,我在MIME Type Detection in Windows Internet Explorer中找到了这个方法能够识别的MIME类型.请参阅list.如您所见,此方法仅限于26种MIME类型.

所以我想知道是否有人能指出我有更多MIME类型的另一种方法,或者另外一种方法/类我可以包含我认为合适的MIME类型.

谢谢.

解决方法

So I was wondering if anyone Could point me to another method with
more MIME types,or alternatively another method / class were I would
be able to include the MIME types I see fit.

我使用Winista和URLMon的混合来检测上传文件的真实格式.

下载Winista:http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx

或者使用URLMon下载项目:
https://github.com/MeaningOfLights/MimeDetect

Winista MIME检测

假设有人使用jpg扩展名重命名exe,您仍然可以使用二进制分析确定“真实”文件格式.它不会检测swf或flv,但几乎所有其他众所周知的格式都可以获得十六进制编辑器并添加它可以检测到的更多文件.

文件魔术

Winista使用XML文件“mime-type.xml”检测真实的MIME类型,该文件包含有关文件类型和用于标识内容类型的签名的信息.eg:

<!--
 !   Audio primary type
 ! -->

<mime-type name="audio/basic"
           description="uLaw/AU Audio File">
    <ext>au</ext><ext>snd</ext>
    <magic offset="0" type="byte" value="2e736e64000000"/>
</mime-type>

<mime-type name="audio/midi"
           description="Musical Instrument Digital Interface MIDI-sequention Sound">
    <ext>mid</ext><ext>midi</ext><ext>kar</ext>
    <magic offset="0" value="MThd"/>
</mime-type>

<mime-type name="audio/mpeg"
           description="MPEG Audio Stream,Layer III">
    <ext>mp3</ext><ext>mp2</ext><ext>mpga</ext>
    <magic offset="0" value="ID3"/>
</mime-type>

当Winista无法检测到真正的文件格式时,我已经使用了URLMon方法:

public class urlmonMimeDetect
{
    [DllImport(@"urlmon.dll",CharSet = CharSet.Auto)]
    private extern static System.UInt32 FindMimeFromData(
        System.UInt32 pBC,[MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl,[MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,System.UInt32 cbSize,[MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed,System.UInt32 dwMimeFlags,out System.UInt32 ppwzMimeOut,System.UInt32 dwReserverd
    );

public string GetMimeFromFile(string filename)
{
    if (!File.Exists(filename))
        throw new FileNotFoundException(filename + " not found");

    byte[] buffer = new byte[256];
    using (FileStream fs = new FileStream(filename,FileMode.Open,FileAccess.Read))
    {
        if (fs.Length >= 256)
            fs.Read(buffer,256);
        else
            fs.Read(buffer,(int)fs.Length);
    }
    try
    {
        System.UInt32 mimetype;
        FindMimeFromData(0,null,buffer,256,out mimetype,0);
        system.intPtr mimeTypePtr = new IntPtr(mimetype);
        string mime = Marshal.PtrToStringUni(mimeTypePtr);
        Marshal.FreeCoTaskMem(mimeTypePtr);
        return mime;
    }
    catch (Exception e)
    {
        return "unkNown/unkNown";
    }
}
}

从Winista方法内部,我回到URLMon:

public MimeType GetMimeTypeFromFile(string filePath)
    {
        sbyte[] fileData = null;
        using (FileStream srcFile = new FileStream(filePath,FileAccess.Read))
        {
            byte[] data = new byte[srcFile.Length];
            srcFile.Read(data,(Int32)srcFile.Length);
            fileData = Winista.Mime.SupportUtil.ToSByteArray(data);
        }

        MimeType oMimeType = GetMimeType(fileData);
        if (oMimeType != null) return oMimeType;

        //We haven't found the file using Magic (eg a text/plain file)
        //so instead use URLMon to try and get the files format
        Winista.MimeDetect.URLMONMimeDetect.urlmonMimeDetect urlmonMimeDetect = new Winista.MimeDetect.URLMONMimeDetect.urlmonMimeDetect();
        string urlmonMimeType = urlmonMimeDetect.GetMimeFromFile(filePath);
        if (!string.IsNullOrEmpty(urlmonMimeType))
        {
            foreach (MimeType mimeType in types)
            {
                if (mimeType.Name == urlmonMimeType)
                {
                    return mimeType;
                }
            }
        }

        return oMimeType;
    }

Winista from netomatix.AFAIK是一个基于2000年初开源Java项目的C#重写.请享用!

您也可以使用由Paul Zahra链接的this post中提到的注册表方法或.Net 4.5 method,但Winista是最好的恕我直言.

更新:

对于桌面应用程序,您可能会发现WindowsAPICodePack更好用:

using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

private static string GetFilePropertyItemTypeTextValueFromShellFile(string filePathWithExtension)
{
   var shellFile = ShellFile.FromFilePath(filePathWithExtension);
   var prop = shellFile.Properties.GetProperty(PItemTypeTextCanonical);
   return prop.FormatFordisplay(PropertyDescriptionFormatOptions.None);
}

C# 一个简易的Producer-Consumer工具类

C# 一个简易的Producer-Consumer工具类

一、关于本文

本文中实现的PCHelper类是一个简易的Producer-Consumer操作工具类。该类可以实现如下目标:由多个线程向其中的一个Queue中写入数据,同时由多个线程负责接收Queue中数据进行处理。

二、工具类代码

/// <summary>
/// Producer-Consumer操作类
/// </summary>
public class PCHelper
{
    readonly object listlock = new object(); //线程锁
    System.Collections.Queue queue = new System.Collections.Queue(); //队列

    /// <summary>
    /// 队列名称:用于标识一个队列
    /// </summary>
    private string _queuename;
    /// <summary>
    /// 队列名称:用于标识一个队列
    /// </summary>
    public string QueueName
    {
        get { return _queuename; }
        private set { _queuename = value; }
    }

    /// <summary>
    /// 队列阈值:队列长度超过阈值后会扔出异常
    /// </summary>
    public uint _threshold;
    /// <summary>
    /// 队列阈值:队列长度超过阈值后会扔出异常
    /// </summary>
    public uint Threshold
    {
        get { return _threshold; }
        private set { _threshold = value; }
    }

    /// <summary>
    /// Producer-Consumer操作类
    /// </summary>
    /// <param name="queuename">队列名</param>
    /// <param name="threshold">队列数据量阈值:超过此阈值会产生异常</param>
    public PCHelper(string queuename = "",uint threshold = 300)
    {
        QueueName = queuename;
        Threshold = threshold;
    }

    /// <summary>
    /// 生产者函数:向队列中添加一条数据
    /// </summary>
    /// <param name="o"></param>
    public void Produce(object o)
    {
        lock (listlock)
        {
            if (queue.Count < Threshold )
            {
                queue.Enqueue(o);
                System.Threading.Monitor.Pulse(listlock);
            }
            else
            {
                throw new Exception("队列长度过长,入队失败");
            }
        }
    }

    /// <summary>
    /// 消费者函数:从队列中取出数据
    /// </summary>
    /// <returns>从队列中取出的第一个数据</returns>
    public object Consume()
    {
        lock (listlock)
        {
            while (queue.Count == 0)
            {
                System.Threading.Monitor.Wait(listlock);
            }
        }
        return queue.Dequeue();
    }

    /// <summary>
    /// 清空数据
    /// </summary>
    public void ClearData()
    {
        lock (listlock)
        {
            queue.Clear();
        }
    }

    /// <summary>
    /// 队列中数据数量
    /// </summary>
    /// <returns></returns>
    public int DataCount()
    {
        int c;
        lock (listlock)
        {
            c = queue.Count;
        }
        return c;
    }

    /// <summary>
    /// 队列中数据类型
    /// </summary>
    /// <returns></returns>
    public Type DataType()
    {
        Type t;
        lock (listlock)
        {
            t = queue.GetType();
        }
        return t;
    }
}

三、测试代码

Program中有Main函数及Main函数需要调用的相关函数。

ProduceLoop函数用于不断向队列queue中写入数据。

ConsumeLoop函数用于不断从队列queue中取出数据。

本段代码中CosumeLoop每次循环的时间间隔被设定要长于ProduceLoop5倍。

因此,当队列到达设定的阈值(本段代码中使用了默认值:300)时,工具类会报出相关异常

class Program
{
    static PCHelper queue;
    static int i;

    static void Main(string[] args)
    {
        queue = new PCHelper("QueueTest");
        i = 0;

        (new System.Threading.Thread(ProduceLoop)).Start(10);
        (new System.Threading.Thread(ConsumeLoop)).Start(50);

        Console.ReadLine();
    }

    /// <summary>
    /// 不断向队列中插入数据
    /// </summary>
    public static void ProduceLoop(object sleeptime)
    {
        while (true)
        {
            queue.Produce(i);
            Console.WriteLine(string.Format(
                "Produce: {0} DataLeft: {1}", i, queue.DataCount()));
            i++;
            System.Threading.Thread.Sleep(int.Parse(sleeptime.ToString()));
        }
    }

    /// <summary>
    /// 不断从队列中取出数据
    /// </summary>
    public static void ConsumeLoop(object sleeptime)
    {
        while (true)
        {
            string temp = queue.Consume().ToString();
            Console.WriteLine(string.Format(
                "Consume: {0} DataLeft: {1}", temp, queue.DataCount()));
            System.Threading.Thread.Sleep(int.Parse(sleeptime.ToString()));
        }
    }
}

四、测试结果

END

我们今天的关于资源模型具有用于HTTP方法GET的模棱两可子资源方法和由“ @Consumes”和“ @Produces”注释定义的输入mime类型的分享已经告一段落,感谢您的关注,如果您想了解更多关于Angular HttpPromise:`success` /`error`方法和`then`的参数之间的区别、Angular HttpPromise:`success`/`error` 方法和`then` 的参数之间的区别、c# – Urlmon.dll中具有更多MIME类型的FindMimeFromData方法的替代方法、C# 一个简易的Producer-Consumer工具类的相关信息,请在本站查询。

本文标签: