Любой бин, который является Converter
, должен работать и автоматически выбираться Spring Shell. Посмотрите на ConversionExample в примерах.
При этом, почему вы говорите, что хотите зарегистрировать все динамически ? Spring Shell предназначен для получения кода, снабженного специальными аннотациями (например, @ShellMethod
). Хотя должна быть возможность динамически выполнять работу, которую выполняют стандартные регистраторы при просмотре этих аннотаций, из ваших примеров видно, что у вас все в порядке с аннотированием кода с помощью @ShellMethod
? Так почему бы не позволить Spring Shell выполнить для вас обнаружение и регистрацию?
Другими словами: почему вы аннотируете интерфейс, а не метод реализации? Если вы это сделаете, вам не придется иметь дело с MethodTarget
и т. Д., Все это делается автоматически для вас Spring Shell.
Надеюсь, это проясняет ситуацию и оказывается самым простым решением
Следующая ссылка возьмет Вас к сообщению, где у кого-то есть метод подавления инструкции по обработке при помощи XmlWriter и вхождения в состояние 'Элемента', а не состояние 'Запуска'. Это заставляет инструкцию по обработке не быть записанной.
Подавите инструкцию по обработке
При передаче XmlWriter сериализатору он только испустит инструкцию по обработке, если состоянием XmlWriter будет 'Запуск' (т.е. еще не имел ничего записанного в него).
// Assume we have a type named 'MyType' and a variable of this type named
'myObject'
System.Text.StringBuilder output = new System.Text.StringBuilder();
System.IO.StringWriter internalWriter = new System.IO.StringWriter(output);
System.Xml.XmlWriter writer = new System.Xml.XmlTextWriter(internalWriter);
System.Xml.Serialization.XmlSerializer serializer = new
System.Xml.Serialization.XmlSerializer(typeof(MyType));
writer.WriteStartElement("MyContainingElement");
serializer.Serialize(writer, myObject);
writer.WriteEndElement();
В этом случае устройство записи будет в состоянии 'Элемента' (в элементе), таким образом, никакая инструкция по обработке не будет записана. Один Вы заканчиваете писать XML, можно извлечь текст из базового потока и обработать его к содержанию основы.
В 2,0, Вы использовали бы XmLWriterSettings. OmitXmlDeclaration, и сериализируют к XmlWriter - однако я не думаю, что это существует в 1,1; настолько не совсем полезный - но просто еще один "считают обновление" вещью... и да, я понимаю, что это не всегда возможно.
Я сделал маленькое исправление
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using ( XmlWriter stringWriter = XmlWriter.Create(builder, settings) )
{
serializer.Serialize(stringWriter, comments);
return builder.ToString();
}
Что относительно того, чтобы опустить пространства имен?
вместо использования
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add("", "");
исключая:
<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
Это работает в.NET 1.1. (Но необходимо все еще рассмотреть обновление),
XmlSerializer s1= new XmlSerializer(typeof(MyClass));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add( "", "" );
MyClass c= new MyClass();
c.PropertyFromDerivedClass= "Hallo";
sw = new System.IO.StringWriter();
s1.Serialize(new XTWND(sw), c, ns);
....
/// XmlTextWriterFormattedNoDeclaration
/// helper class : eliminates the XML Documentation at the
/// start of a XML doc.
/// XTWFND = XmlTextWriterFormattedNoDeclaration
public class XTWFND : System.Xml.XmlTextWriter
{
public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; }
public override void WriteStartDocument() { }
}
Если путем "обработки инструкции" Вы имеете в виду определение XML, то можно избежать этого путем установки свойства OmitXmlDeclaration XmlWriterSettings. Необходимо будет сериализировать использование XmlWriter, для выполнения этого.
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using ( XmlWriter stringWriter = new StringWriter(builder, settings) )
{
serializer.Serialize(stringWriter, comments);
return builder.ToString();
}
Но ах, это не отвечает на Ваш вопрос для 1,1. Ну, для ссылки на других.