Исключение говорит о том, что значение JSON, которое у вас есть, является строкой, что-то вроде:
{ "protocol" : "http" }
или, возможно, "JSON в двойных кавычках":
"\"{\"property\":\"value\"}\"
при попытке связать как:
ProtocolContainer p = mapper.readValue(json, ProtocolContainer.class);
В этом случае у Джексона нет свойств для сопоставления, только строка. И в этом случае он действительно требует либо собственного десериализатора, либо метода создателя. Методы-создатели являются либо конструкторами с одностроковым аргументом, либо статическими методами с одностроковым аргументом: разница в том, что только конструкторы могут быть обнаружены автоматически (это просто практический ярлык, поскольку может быть только один такой конструктор, но несколько статические методы).
Ваше решение действительно работает, просто подумал, что я бы немного рассказал о том, что происходит.
Читая его во второй раз, кажется более вероятным, что у вас есть двойные кавычки (JSON в JSON): еще одна вещь, которую следует рассмотреть, - это получить простой JSON, если это возможно. Но, может быть, это трудно сделать.