2013-07-05 4 views
0

Я работаю с Mule Studio в этом, и я действительно задавался вопросом о возможности добавления выпадающего списка с «пользовательским» строковым именем. Это относится к именам MIME-типов (ContentTypes). (То есть: текст/CSS, текст/JavaScript, и так)Как создать типы перечислений строк без переопределения метода toString, который будет использоваться в Mule Studio?

Сделана структура, как это:

public enum HttpContentType { 
     TEXT_PLAIN 
     { 
      public String toString() { 
       return "text/plain"; 
      } 
     }, 
     TEXT_CSS 
     {   
      public String toString() { 
       return "text/css"; 
      } 
     }, 
     TEXT_JS 
     { 
      public String toString() { 
       return "text/javascript"; 
      } 
     }, 
     TEXT_XML 
     { 
      public String toString() { 
       return "text/xml"; 
      } 
     }, 
    }; 

Чтобы потом можно использовать, как это как Настраиваемый атрибут:

/** 
    * Connection Content Types 
    */ 
    @Configurable 
    @Placement(order=1,group="Configuration",tab="HTTP Configuration") 
    private HttpContentType contentType; 

Но конечно, что, читая это из Mule Studio, это будет раскрывающийся список с такими именами, как: TEXT_CSS, TEXT_XML, TEXT_JAVASCRIPT (http://puu.sh/3vLbd.png) и поэтому вместо text/css, text/xml, text/javascript.

Как я могу достичь этого результата?

ответ

3

Гораздо лучший способ для достижения этой цели было бы обеспечить поле в перечислении, и предоставить соответствующий конструктор:

public enum HttpContentType { 
    TEXT_PLAIN("text/plain"), 
    TEXT_CSS("text/css"); 

    private String value; 

    HttpContentType(String value) { 
     this.value = value; 
    } 

    public String toString() { 
     return this.value; 
    } 

    public static HttpContentType getByValue(String value){ 
     for (final HttpContentType element : EnumSet.allOf(HttpContentType.class)) { 
      if (element.toString().equals(value)) { 
       return element; 
      } 
     } 
     return null; 
    } 
} 
+0

Это, безусловно, самый лучший способ. Тогда вам нужно только переопределить toString() и вернуть значение this.value. –

+0

Да, это сработало бы я, но Mule этого не возьмет. Не знаю, почему он берет имена перечислений и не заботится о методах в нем. – msqar

+0

@msqar. Ну, я понятия не имею о поведении на Муле. –

0

Одним из вариантов является предоставление другой способ, чтобы получить строку MIME.

public interface IMimeTypeProvider { 
    public String toMimeType(); 
} 

public enum HttpContentType implements IMimeTypeProvider { 
    TEXT_PLAIN 
    { 
     public String toMimeType() { 
      return "text/plain"; 
     } 
    }, 
    ... 

    public String toMimeType() { 
     return "text/plain"; 
    } 
} 

Вы также можете рассмотреть возможность добавления метода toDisplayString(). Имя счетчика необязательно является хорошим отображаемым именем, даже в одной локали.

+0

Я знаю, что ваш пример будет работать, но мне нужно, чтобы он работал с Mule. Mule выглядит как не распознающий внутренние методы, переопределенные методы и так, только физическое имя enum «TEXT_XXXX». Думайте, что он будет работать с аннотациями вроде FriendlyName (value = "text/css") или Mime (value = "..."). Идя, чтобы проверить это и сообщить вам, ребята, знаете. – msqar

+0

Только для точности @msqar говорит о Mule Studio (IDE), а не Mule ESB. –

+0

@ DavidDossot снова Дэвид!: Sup! вы знаете, как это сделать? Пробовал с Mime, аннотациями FriendlyName, переопределяющими методами, пока ничего не работает. Подумайте, как этого добиться. Слишком плохо о официальной документации Мула! попробовал публикацию в Mule Forum, но никто не ответил! : S – msqar

0
public enum HttpContentType { 
TEXT_PLAIN("text/plain"), TEXT_CSS("text/css"); 

private String code; 

HttpContentType(String code) { 
    this.code = code; 
} 

public String toString() { 
    return code; 
} 

public static HttpContentType getEnum(String code) { 
    if (code.equals("text/plain")) { 
     return TEXT_PLAIN; 
    } else if (code.equals("text/css")) { 
     return TEXT_CSS; 
    } else { 
     return null; 
    } 
} 

}