【问题标题】:select2 autocomplete error on views (spring roo rc1)视图上的 select2 自动完成错误(spring roo rc1)
【发布时间】:2017-03-09 14:33:24
【问题描述】:

在使用 RC1 生成项目时,我的工作没有任何问题。在对该项目进行了一些工作后,我意识到使用 select2 自动完成的 CRUD 字段突然停止工作。当 s2 尝试从 /entity/s2 路径获取数据时,我收到错误 500。

完整的java控制台错误:

2017-03-09 11:20:46.136  WARN 42495 --- [nio-8080-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No converter found capable of converting from type [ar.edu.um.programacion2.oficios.reference.Disponibilidad] to type [java.lang.String] (through reference chain: io.springlets.data.web.select2.Select2DataWithConversion["results"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No converter found capable of converting from type [ar.edu.um.programacion2.oficios.reference.Disponibilidad] to type [java.lang.String] (through reference chain: io.springlets.data.web.select2.Select2DataWithConversion["results"])
2017-03-09 11:20:46.137  WARN 42495 --- [nio-8080-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No converter found capable of converting from type [ar.edu.um.programacion2.oficios.reference.Disponibilidad] to type [java.lang.String] (through reference chain: io.springlets.data.web.select2.Select2DataWithConversion["results"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No converter found capable of converting from type [ar.edu.um.programacion2.oficios.reference.Disponibilidad] to type [java.lang.String] (through reference chain: io.springlets.data.web.select2.Select2DataWithConversion["results"])

任何这些字段引用字段现在都不起作用。这是该字段中用作参考的实体之一:

@RooJavaBean
@RooToString
@RooJpaEntity
@RooEquals(isJpaEntity = true)
public class Localidad {

    public Localidad(String nombre, String descripcion) {
        super();
        this.nombre = nombre;
        this.descripcion = descripcion;
    }

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    @Version
    private Integer version;

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    @NotNull
    private String nombre;

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    private String descripcion;


    private String googleMapsString;


    /**
     * TODO Auto-generated method documentation
     * 
     * @return String
     */
    public String toString() {
        return getNombre();
    }

    public String getMapString(){
        return "http://maps.googleapis.com/maps/api/staticmap?" + getGoogleMapsString() + "&key=";
    }
}

引用字段所在的类:

@RooJavaBean
@RooToString
@RooJpaEntity
@RooEquals(isJpaEntity = true)
public class Servicio {

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    @Version
    private Integer version;

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    @NotNull
    private String nombre;

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    private String descripcion;

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    @RooUploadedFile(contentType = "image/png")
    @Lob
    private byte[] logo;

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    @NotNull
    private String telefono;

    /**
     * TODO Auto-generated attribute documentation
     *
     */
    @NumberFormat
    private float puntaje;

    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="localidad_id")
    private Localidad localidad;

    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="disponibilidad_id")
    private Disponibilidad disponibilidad;

    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="categoria_id")
    private Categoria categoria;

    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="prestador_id")
    private Prestador prestador;

    @ManyToMany
    @JoinTable(name = "servicio_calificacion", joinColumns = @JoinColumn(name = "servicio_id"), inverseJoinColumns = @JoinColumn(name = "calificacion_id"))
    private List<CalificacionCliente> listadecalificaciones;


    /**
     * TODO Auto-generated method documentation
     * 
     * @return String
     */
    public String toString() {
        return getNombre() + " (" + getPrestador() + ")";
    }
}

其中一个观点是使用了该字段:

<!DOCTYPE html>
<html lang="en" data-layout-decorate="~{layouts/default-layout}">
  <head id="head">

    <title data-th-text="#{label_create_entity(#{label_servicio})}">
      Create Servicio - oficios - SpringRoo Application</title>

    <!-- DateTimePicker -->
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.4/build/jquery.datetimepicker.min.css" data-th-href="@{/webjars/datetimepicker/build/jquery.datetimepicker.min.css}" />

  </head>

  <body id="body">

    <header role="banner">
      <!-- Content replaced by layout of the page displayed -->
    </header>

    <!-- CONTAINER -->
    <div class="container bg-container">
      <!-- CONTENT -->
      <!--
        Only the inner content of the following tag "section" is included
        within the template, in the section "content"
      -->
      <section data-layout-fragment="content">
        <div class="container-fluid content" data-th-with="collectionLink=${@linkBuilder.of('ServiciosCollectionThymeleafController')}">

          <h1 data-th-text="#{label_create_entity(#{label_servicio})}">Create Servicio</h1>

          <!-- FORM -->
          <form class="form-horizontal validate" method="POST" data-th-object="${servicio}" data-th-action="@{${collectionLink.to('create').with('servicio', servicio.id)}}">

            <fieldset id="containerFields">
              <legend class="sr-only" data-th-text="#{label_data_entity(#{label_servicio})}">Servicio data </legend>

<div class="form-group has-error has-feedback" data-z="15c04ac1" id="servicio-nombre-field" data-th-classappend="${#fields.hasErrors('nombre')}? 'has-error has-feedback'" data-th-class="form-group">
  <label for="nombre" class="col-md-3 control-label" data-th-text="#{label_servicio_nombre}">nombre</label>
  <div class="col-md-6">
    <input id="nombre" name="nombre" data-th-value="*{{nombre}}" type="text" class="form-control" placeholder="nombre" data-th-placeholder="#{label_servicio_nombre}" data-toggle="tooltip" aria-describedby="nombreStatus" required="required" />
      <span data-th-classappend="${#fields.hasErrors('nombre')}? 'glyphicon glyphicon-remove form-control-feedback'" class="glyphicon glyphicon-remove form-control-feedback" data-th-if="${#fields.hasErrors('nombre')}" aria-hidden="true"></span>
      <span id="nombre-error" class="help-block" data-th-if="${#fields.hasErrors('nombre')}" data-th-errors="*{nombre}">Error message.</span>
  </div>
</div>
<div class="form-group has-error has-feedback" data-z="8d2c287d" id="servicio-descripcion-field" data-th-classappend="${#fields.hasErrors('descripcion')}? 'has-error has-feedback'" data-th-class="form-group">
  <label for="descripcion" class="col-md-3 control-label" data-th-text="#{label_servicio_descripcion}">descripcion</label>
  <div class="col-md-6">
    <input id="descripcion" name="descripcion" data-th-value="*{{descripcion}}" type="text" class="form-control" placeholder="descripcion" data-th-placeholder="#{label_servicio_descripcion}" data-toggle="tooltip" aria-describedby="descripcionStatus" />
      <span data-th-classappend="${#fields.hasErrors('descripcion')}? 'glyphicon glyphicon-remove form-control-feedback'" class="glyphicon glyphicon-remove form-control-feedback" data-th-if="${#fields.hasErrors('descripcion')}" aria-hidden="true"></span>
      <span id="descripcion-error" class="help-block" data-th-if="${#fields.hasErrors('descripcion')}" data-th-errors="*{descripcion}">Error message.</span>
  </div>
</div>
<div class="form-group has-error has-feedback" data-z="54220f01" id="servicio-logo-field" data-th-classappend="${#fields.hasErrors('logo')}? 'has-error has-feedback'" data-th-class="form-group">
  <label for="logo" class="col-md-3 control-label" data-th-text="#{label_servicio_logo}">logo</label>
  <div class="col-md-3">
    <input id="logo" name="logo" data-th-value="*{{logo}}" type="text" class="form-control inputmask" placeholder="logo" data-th-placeholder="#{label_servicio_logo}" data-toggle="tooltip" aria-describedby="logoStatus" data-inputmask-alias="numeric" data-inputmask-digits="2" />
      <span data-th-classappend="${#fields.hasErrors('logo')}? 'glyphicon glyphicon-remove form-control-feedback'" class="glyphicon glyphicon-remove form-control-feedback" data-th-if="${#fields.hasErrors('logo')}" aria-hidden="true"></span>
      <span id="logo-error" class="help-block" data-th-if="${#fields.hasErrors('logo')}" data-th-errors="*{logo}">Error message.</span>
  </div>
</div>
<div class="form-group has-error has-feedback" data-z="f1acb8e1" id="servicio-telefono-field" data-th-classappend="${#fields.hasErrors('telefono')}? 'has-error has-feedback'" data-th-class="form-group">
  <label for="telefono" class="col-md-3 control-label" data-th-text="#{label_servicio_telefono}">telefono</label>
  <div class="col-md-6">
    <input id="telefono" name="telefono" data-th-value="*{{telefono}}" type="text" class="form-control" placeholder="telefono" data-th-placeholder="#{label_servicio_telefono}" data-toggle="tooltip" aria-describedby="telefonoStatus" required="required" />
      <span data-th-classappend="${#fields.hasErrors('telefono')}? 'glyphicon glyphicon-remove form-control-feedback'" class="glyphicon glyphicon-remove form-control-feedback" data-th-if="${#fields.hasErrors('telefono')}" aria-hidden="true"></span>
      <span id="telefono-error" class="help-block" data-th-if="${#fields.hasErrors('telefono')}" data-th-errors="*{telefono}">Error message.</span>
  </div>
</div>
<div class="form-group has-error has-feedback" data-z="3c00987d" id="servicio-localidad-field" data-th-classappend="${#fields.hasErrors('localidad')}? 'has-error has-feedback'" data-th-class="form-group" data-th-with="collectionLink=${@linkBuilder.of('LocalidadsCollectionThymeleafController')}">
    <label for="localidad" class="col-md-3 control-label" data-th-text="#{label_servicio_localidad}">Localidad</label>
    <div class="col-md-6">
      <!-- Select2 -->
      <select data-th-field="*{localidad}" class="form-control dropdown-select-ajax" data-allow-clear="true" data-data-ajax--url="${collectionLink.to('select2')}" data-ajax--cache="true" data-ajax--delay="250" data-ajax--data-type="json" data-data-placeholder="#{info_select_an_option}">
          <option data-th-unless="*{localidad} == null" data-th-value="*{localidad.id}" data-th-text="*{{localidad}}" selected="selected">Localidad</option>
      </select>
      <span data-th-classappend="${#fields.hasErrors('localidad')}? 'glyphicon glyphicon-remove form-control-feedback'" class="glyphicon glyphicon-remove form-control-feedback" data-th-if="${#fields.hasErrors('localidad')}" aria-hidden="true"></span>
      <span id="localidad-error" class="help-block" data-th-if="${#fields.hasErrors('localidad')}" data-th-errors="*{localidad}">Error message.</span>
    </div>
</div>
<div class="form-group has-error has-feedback" data-z="19c21a81" id="servicio-disponibilidad-field" data-th-classappend="${#fields.hasErrors('disponibilidad')}? 'has-error has-feedback'" data-th-class="form-group" data-th-with="collectionLink=${@linkBuilder.of('DisponibilidadsCollectionThymeleafController')}">
    <label for="disponibilidad" class="col-md-3 control-label" data-th-text="#{label_servicio_disponibilidad}">Disponibilidad</label>
    <div class="col-md-6">
      <!-- Select2 -->
      <select data-th-field="*{disponibilidad}" class="form-control dropdown-select-ajax" data-allow-clear="true" data-data-ajax--url="${collectionLink.to('select2')}" data-ajax--cache="true" data-ajax--delay="250" data-ajax--data-type="json" data-data-placeholder="#{info_select_an_option}">
          <option data-th-unless="*{disponibilidad} == null" data-th-value="*{disponibilidad.id}" data-th-text="*{{disponibilidad}}" selected="selected">Disponibilidad</option>
      </select>
      <span data-th-classappend="${#fields.hasErrors('disponibilidad')}? 'glyphicon glyphicon-remove form-control-feedback'" class="glyphicon glyphicon-remove form-control-feedback" data-th-if="${#fields.hasErrors('disponibilidad')}" aria-hidden="true"></span>
      <span id="disponibilidad-error" class="help-block" data-th-if="${#fields.hasErrors('disponibilidad')}" data-th-errors="*{disponibilidad}">Error message.</span>
    </div>
</div>
<div class="form-group has-error has-feedback" data-z="1d95a73d" id="servicio-categoria-field" data-th-classappend="${#fields.hasErrors('categoria')}? 'has-error has-feedback'" data-th-class="form-group" data-th-with="collectionLink=${@linkBuilder.of('CategoriasCollectionThymeleafController')}">
    <label for="categoria" class="col-md-3 control-label" data-th-text="#{label_servicio_categoria}">Categoria</label>
    <div class="col-md-6">
      <!-- Select2 -->
      <select data-th-field="*{categoria}" class="form-control dropdown-select-ajax" data-allow-clear="true" data-data-ajax--url="${collectionLink.to('select2')}" data-ajax--cache="true" data-ajax--delay="250" data-ajax--data-type="json" data-data-placeholder="#{info_select_an_option}">
          <option data-th-unless="*{categoria} == null" data-th-value="*{categoria.id}" data-th-text="*{{categoria}}" selected="selected">Categoria</option>
      </select>
      <span data-th-classappend="${#fields.hasErrors('categoria')}? 'glyphicon glyphicon-remove form-control-feedback'" class="glyphicon glyphicon-remove form-control-feedback" data-th-if="${#fields.hasErrors('categoria')}" aria-hidden="true"></span>
      <span id="categoria-error" class="help-block" data-th-if="${#fields.hasErrors('categoria')}" data-th-errors="*{categoria}">Error message.</span>
    </div>
</div>
            </fieldset>


              <!-- buttons form -->
              <div class="form-group">
                <div class="col-md-9 col-md-offset-3">
                    <button type="submit" class="btn btn-primary" data-th-text="#{label_save}">Save</button>
                    <button type="reset" class="btn btn-default"  onclick="window.history.back()" data-th-text="#{label_reset}">Cancel</button>
                </div>
              </div>

          </form>
          <!-- /FORM -->

        </div>

      </section>
      <!-- /CONTENT -->
  </div>
  <!-- /CONTAINER -->

  <footer class="container">
    <!-- Content replaced by layout of the page displayed -->
  </footer>

  <!-- JavaScript
  ================================================== -->
  <!-- Placed at the end of the document so that the pages load faster -->
  <!-- JavaScript loaded by layout of the page displayed -->
  <!--
       Only the inner content of the following tag "javascript" is included
       within the template, in the div "javascript"
      -->
  <div data-layout-fragment="javascript">

    <!-- DateTimePicker -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.4/build/jquery.datetimepicker.full.min.js" data-th-src="@{/webjars/datetimepicker/build/jquery.datetimepicker.full.min.js}"></script>
    <script src="../../static/public/js/datetimepicker-defaults.js" data-th-src="@{/public/js/datetimepicker-defaults.js}"></script>

    <!-- jquery.inputmask -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.3.1/jquery.inputmask.bundle.min.js" data-th-src="@{/webjars/jquery.inputmask/min/jquery.inputmask.bundle.min.js}"></script>
    <script type="text/javascript" data-th-inline="javascript">
                    (function(jQuery) {
                        jQuery(document)
                                .ready(
                                        function() {
                                            Inputmask
                                                    .extendAliases({
                                                        'numeric' : {
                                                            'groupSeparator' : /*[[#{label_inputmask_groupSeparator}]]*/'.',
                                                            'radixPoint' : /*[[#{label_inputmask_radixPoint}]]*/','
                                                        },
                                                        'currency' : {
                                                            'prefix' : /*[[#{label_inputmask_prefix}]]*/'',
                                                            'suffix' : /*[[#{label_inputmask_suffix}]]*/' €'
                                                        }
                                                    });
                                        });
                    })(jQuery);
        </script>
    <script src="../../static/public/js/inputmask-defaults.js" data-th-src="@{/public/js/inputmask-defaults.js}"></script>

    <!-- JQuery Validation -->
    <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.15.0/jquery.validate.min.js" data-th-src="@{/webjars/jquery-validation/dist/jquery.validate.min.js}">
          </script>
    <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.15.0/additional-methods.min.js" data-th-src="@{/webjars/jquery-validation/dist/additional-methods.min.js}">
            </script>
    <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.15.0/localization/messages_es.js" data-th-src="@{/webjars/jquery-validation/src/localization/messages_}+${#locale.language}+'.js'" data-th-if="${#locale.language} != 'en'">
            </script>
    <script src="../../static/public/js/validation-defaults.js" data-th-src="@{/public/js/validation-defaults.js}">
            </script>

    <script type="text/javascript" data-th-inline="javascript">
                    (function(jQuery) {
                        jQuery(document)
                                .ready(
                                        function() {
                                            jQuery
                                                    .extend(
                                                            jQuery.validator.messages,
                                                            {
                                                                'dateformat' : /*[[#{error_invalid_date}]]*/'Please enter a correct date/time',
                                                                'inputmask' : /*[[#{error_invalid_maskValue}]]*/'Please enter a valid value',
                                                            });
                                        });
                    })(jQuery);
          </script>

    </div>

  </body>

</html>

Log.roo

// Spring Roo 2.0.0.RC1 [rev 28015e3] log opened at 2017-03-06 20:50:24
project setup --topLevelPackage ar.edu.um.programacion2.oficios --java 8
jpa setup --database MYSQL --provider HIBERNATE --hostName 127.0.0.1 --databaseName oficiosdb --userName root
entity jpa --class ~.reference.Persona
field string --fieldName username --unique
field string --fieldName password --notNull
field string --fieldName email --unique
field string --fieldName telefono
field file --fieldName avatar --contentType PNG 
entity jpa --class ~.domain.Prestador  --extends ~.reference.Persona
field string --fieldName razonsocial --notNull
field string --fieldName oficio --notNull
entity jpa --class ~.reference.Disponibilidad
field string --fieldName franjahoraria --notNull
field string --fieldName descripcion
entity jpa --class ~.reference.Localidad
field string --fieldName nombre --notNull
field string --fieldName descripcion
entity jpa --class ~.reference.Categoria
field string --fieldName nombre --notNull
field string --fieldName descripcion
enum type --class ~.reference.TipoCalif
enum constant --name POSITIVO
enum constant --name NEGATIVO
enum constant --name NEUTRAL
entity jpa --class ~.domain.Cliente  --extends ~.reference.Persona
field string --fieldName nombre --notNull 
field string --fieldName apellido --notNull
field string --fieldName domicilio
field string --fieldName domicilio2
entity jpa --class ~.domain.Calificacion
field string --fieldName comentario --notNull
field enum --fieldName tipo --type ~.reference.TipoCalif
entity jpa --class ~.domain.CalificacionCliente  --extends ~.domain.Calificacion
entity jpa --class ~.domain.Servicio
field string --fieldName nombre --notNull 
field string --fieldName descripcion
field file --fieldName logo --contentType PNG
field string --fieldName telefono --notNull
field number --fieldName puntaje --type float
entity jpa --class ~.domain.CalificacionPrestador  --extends ~.domain.Calificacion
repository jpa --all
finder add --name findByTelefono --entity ~.domain.Servicio
finder add --name findByNombreLike --entity ~.domain.Servicio
finder add --name findByPuntaje --entity ~.domain.Servicio
finder add --name findByUsername --entity ~.domain.Cliente
finder add --name findByUsername --entity ~.domain.Prestador
finder add --name findByEmail --entity ~.domain.Cliente
finder add --name findByEmail --entity ~.domain.Prestador
service --all
web mvc setup
web mvc view setup --type THYMELEAF
web mvc controller --all --responseType THYMELEAF
web mvc templates setup --type THYMELEAF
web mvc language --code es --useAsDefault
// script --file script_roo
// Spring Roo 2.0.0.RC1 [rev 28015e3] log opened at 2017-03-06 21:19:16
help
// Spring Roo 2.0.0.RC1 [rev 28015e3] log closed at 2017-03-07 09:03:07
// Spring Roo 2.0.0.RC1 [rev 28015e3] log opened at 2017-03-07 20:12:48
// Spring Roo 2.0.0.RC1 [rev 28015e3] log closed at 2017-03-08 01:34:17
// Spring Roo 2.0.0.RC1 [rev 28015e3] log opened at 2017-03-08 01:34:37
web mvc finder --entity ~.domain.Servicio 
// Spring Roo 2.0.0.RC1 [rev 28015e3] log closed at 2017-03-08 02:28:28
// Spring Roo 2.0.0.RC1 [rev 28015e3] log opened at 2017-03-08 02:28:44
web mvc finder --all
web mvc finder --all 
// Spring Roo 2.0.0.RC1 [rev 28015e3] log closed at 2017-03-08 02:29:31
// Spring Roo 2.0.0.RC1 [rev 28015e3] log opened at 2017-03-08 02:29:39
// Spring Roo 2.0.0.RC1 [rev 28015e3] log closed at 2017-03-08 02:29:54
// Spring Roo 2.0.0.RC1 [rev 28015e3] log opened at 2017-03-08 02:30:11
hint
help
web mvc finder --all 
web mvc finder --entity ~.domain.Cliente
web mvc finder --all 
web mvc finder --all --responseType THYMELEAF 
web mvc finder --entity ~.domain.Servicio --responseType THYMELEAF 
// Spring Roo 2.0.0.RC1 [rev 28015e3] log closed at 2017-03-08 03:13:33
// Spring Roo 2.0.0.RC1 [rev 28015e3] log opened at 2017-03-08 03:14:23
hint
hint finders
finder add --entity ~.domain.Servicio --name findByCategoria
finder add --entity ~.domain.Servicio --name queryByCategoria
finder add --entity ~.reference.Categoria --name findByNombre
security setup --provider SPRINGLETS_JPA 
entity jpa --class ~.domain.Administrador --extends ~.reference.Persona
web mvc controller --entity ~.domain.Administrador
service --entity ~.domain.Administrador 
repository jpa --entity ~.domain.Administrador 
service --entity ~.domain.Administrador 
web mvc controller --entity ~.domain.Administrador 
web mvc controller --entity ~.domain.Administrador --responseType THYMELEAF 
finder add --entity ~.reference.Persona --name findByUsername
// Spring Roo 2.0.0.RC1 [rev 28015e3] log closed at 2017-03-08 08:02:54
// Spring Roo 2.0.0.RC1 [rev 28015e3] log opened at 2017-03-08 21:06:10
// Spring Roo 2.0.0.RC1 [rev 28015e3] log closed at 2017-03-09 09:30:10
// Spring Roo 2.0.0.RC1 [rev 28015e3] log opened at 2017-03-09 10:08:32
// Spring Roo 2.0.0.RC1 [rev 28015e3] log closed at 2017-03-09 15:51:20

注意:首先我认为弹簧安全是问题,因为用户没有权限列出该实体,但是当我授予用户权限时,问题从错误 403 变为我现在有500。 在那之后,我完全陷入了困境。我尝试再次生成所有视图,但没有效果。

谢谢

【问题讨论】:

  • 您能否提供一个模拟 de 错误的 log.roo 文件以便能够检查此问题?问候,
  • 我添加了我的 log.roo,但我真的不知道如何重现它。
  • 我刚刚执行了您提供的log.roo,但只生成了枚举的select2 字段...您如何包含Servicio 和Disponibilidad 之间的关系@OneToOne?你是手动做的吗?问候,
  • 哦,是的,对不起,我自己创建了它们,因为我需要一种方式,我无法通过 roo 提供的方式来实现它们。我只是添加了带有注释的字段,您可以在我在帖子中公开的服务类中看到它们。创建该字段后,roo 成功创建了视图,并且它们直到昨天都正常工作。
  • 嗯,您是否在应用手动更改后打开了 Spring Roo shell?也许 Spring ROO shell 检测到您的手动更改,并且它正在对您的代码应用一些更改,从而使您的 select2 组件无法正常工作。强烈建议使用 git 或 subversion 之类的版本控制并在打开 Spring Roo shell 之前上传您的更改。如果应用了一些新的更改,您可以快速检测到它。

标签: spring-mvc spring-boot spring-roo


【解决方案1】:

在您对 Spring Security 配置类遇到的问题以及转换器注册出现的错误发表最后评论后,我知道您的问题出在哪里。

几周前,我在 Spring Security 中检测到一个问题,并在他们的存储库中创建了以下问题:

https://github.com/spring-projects/spring-security/issues/4202

似乎如果@Configuration 类扩展了WebSecurityConfigurerAdapter 抽象类(如在Spring Roo 生成的代码中),则某些组件在formatters 注册之前尝试@Autowired 一个ConversionService 实例在 Spring 上下文中,因此 addFormatters 方法不包含任何格式化程序。

一个简单的解决方法可以解决您的问题并且您将能够在您的项目中使用 Spring Security 是在生成的 SecurityConfiguration 类中使用 @Override setContentNegotiationStrategy 方法而不包含 @Autowired 注释.

以下示例介绍如何正确覆盖此方法。 (在此示例中,代码已被注释)

https://github.com/jcagarcia/proofs/blob/master/spring-security-and-formatters/src/main/java/org/springframework/roo/petclinic/config/security/SecurityConfiguration.java#L54

如果这解决了你的问题,那你comment on the issue 说你有同样的问题会很好。

希望对您有所帮助,感谢您提供的所有信息!

【讨论】:

  • 谢谢!我到家时会检查一下并告诉你。
  • 天哪,它就像一个魅力!由于这个错误,我的项目被困了一周。我已经将您的答案标记为正确。现在我正在评论关于这个的spring security git问题。谢谢!
【解决方案2】:

您可以在这里找到 Java 中的 Select2 与示例 URL 一起使用:http://www.javasolution.in/search/label/autocomplete 您可以在这里找到带有描述的完整代码

【讨论】:

    猜你喜欢
    • 2012-05-16
    • 2023-03-16
    • 2017-12-29
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多