Перечисления Java: два типа перечислений, каждый из которых содержит ссылки друг на друга?

Проблема:

java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

указывает, что вы пытаетесь использовать сервлет Джерси 2.x, но вы поставляете лиги Джерси 1.x.

Для Джерси 1 .x вы должны сделать это следующим образом:


  Jersey REST Service

  com.sun.jersey.spi.container.servlet.ServletContainer

  
    com.sun.jersey.config.property.packages
    sample.hello.resources
  
  1


  Jersey REST Service
  /rest/*

Для получения дополнительной информации проверьте документацию Jersey 1.x . Если вы вместо этого хотите использовать Jersey 2.x, то вам придется предоставить Jersey 2.x libs. В проекте, основанном на maven, вы можете использовать следующее:


    org.glassfish.jersey.containers
    jersey-container-servlet
    2.xx



    org.glassfish.jersey.core
    jersey-client
    2.xx

Для Jersey 2.x вам не нужно ничего настраивать в web.xml, достаточно предоставить класс, подобный этому :

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest")
public class ApplicationConfig extends Application {

}

Для получения дополнительной информации проверьте документацию Jersey .

См. также:

30
задан falsarella 18 August 2014 в 23:56
поделиться

3 ответа

Проблема не столько в том, что «два перечисления ссылаются друг на друга», сколько в том, что «два перечисления ссылаются друг на друга в своих конструкторах ». Эта круговая ссылка представляет собой сложную часть.

Как насчет использования методов Foo.setResponse (Bar b) и Bar.setResponse (Foo f) ? Вместо того, чтобы устанавливать Foo's Bar в конструкторе Foo (и аналогично Bar's Foo в конструкторе Bar), вы выполняете инициализацию с помощью метода? Например:

Foo:

public enum Foo {
  A, B, C;

  private void setResponse(Bar b) {
    this.b = b;
  }

  private Bar b;

  public Bar getB() {
    return b;
  }

  static {
    A.setResponse(Bar.Alpha);
    B.setResponse(Bar.Delta);
    C.setResponse(Bar.Alpha);
  }
}

Bar:

public enum Bar {
  Alpha, Beta, Delta;

  private void setResponse(Foo f) {
    this.f = f;
  }

  private Foo f;

  public Foo getF() {
    return f;
  }

  static {
    Alpha.setResponse(Foo.A);
    Beta.setResponse(Foo.C);
    Delta.setResponse(Foo.C);
  }
}

Также вы упомянули, что Foo и Bar - это два типа сообщений. Можно ли их объединить в один вид? Насколько я могу судить, их поведение здесь такое же. Это не исправляет круговую логику, но может дать вам другое представление о вашем дизайне ...

11
ответ дан 27 November 2019 в 22:36
поделиться

Поскольку кажется, что вы все равно будете жестко кодировать, почему бы не иметь что-то вроде

public static Bar responseBar(Foo f) {
 switch(f) {
  case A: return Bar.Alpha;
  // ... etc
 }
}

для каждого перечисления? Похоже, что в вашем примере у вас есть несколько перекрывающихся ответов, так что вы даже можете воспользоваться случаем, проваливающимся.

EDIT:

Мне нравится предложение Тома о EnumMap; Я думаю, что производительность , вероятно, выше на EnumMap, но вид элегантной конструкции, описанной в Effective Java, похоже, не обеспечивается этой конкретной проблемой - однако предложенное выше решение переключения было бы хорошим способом для создания двух статических EnumMaps ответ может быть примерно таким:

 public static Bar response(Foo f) { return FooToBar.get(f); }
 public static Foo response(Bar b) { return BarToFoo.get(b); }
4
ответ дан 27 November 2019 в 22:36
поделиться

Интересный дизайн. Я вижу вашу потребность, но что вы собираетесь делать, когда требования немного изменятся, так что в ответ на Foo.Epsilon приложение_1 должно отправить либо Bar.Gamma, либо Bar.Whatsit?

Решение, которое вы сочли и отвергли как хакерское (размещение отношения на карте), похоже, дадут вам большую гибкость и позволят избежать циклических ссылок. Это также сохраняет ответственность разделенной: сами типы сообщений не должны отвечать за знание своего ответа, не так ли?

2
ответ дан 27 November 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: