小编Mic*_*tti的帖子

Java泛型自引用:它安全吗?

我有这个简单的界面:

public interface Node<E extends Node<E>>
{
    public E getParent();

    public List<E> getChildren();

    default List<E> listNodes()
    {
        List<E> result = new ArrayList<>();

        // ------> is this always safe? <-----
        @SuppressWarnings("unchecked")
        E root = (E) this;

        Queue<E> queue = new ArrayDeque<>();
        queue.add(root);

        while(!queue.isEmpty())
        {
            E node = queue.remove();

            result.add(node);

            queue.addAll(node.getChildren());
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到它this总是Node<E>(根据定义)的一个实例.
但是我无法想象一个this不是实例的情况E......
因为E extends Node<E>,不应该也不Node<E>等同于E定义?

你能给出一个实例的对象的例子Node<E>,但它不是一个实例E吗?

与此同时,我的大脑正在融化......


上一课是一个简化的例子. …

java generics this self-reference

16
推荐指数
1
解决办法
671
查看次数

JPA条件API查询子类属性

我想执行一个匹配特定子类属性的查询,所以我正在尝试使用treat().

在这个例子中我想要:

名称以"a"开头的
所有科目,或所有科目,即姓名以"a"开头的人

private List<Subject> q1()
{
    CriteriaBuilder b = em.getCriteriaBuilder();

    CriteriaQuery<Subject> q = b.createQuery(Subject.class);
    Root<Subject> r = q.from(Subject.class);
    q.select(r);
    q.distinct(true);
    q.where(
        b.or(
            b.like(r.get(Subject_.name), "a%"),
            b.like(b.treat(r, Person.class).get(Person_.lastName), "a%")));

    return em.createQuery(q).getResultList();
}
Run Code Online (Sandbox Code Playgroud)

显然,Person扩展Subject,Subject是抽象的,继承是SINGLE_TABLE,Subject@DiscriminatorOptions(force = true)其他原因 (非进水).

但生成的SQL是这样的:

select distinct subject0_.ID as ID2_71_, subject0_.CODE as CODE3_71_, ...
from SUBJECT subject0_ 
where subject0_.DTYPE='Person' and (subject0_.name like 'a%' or subject0_.lastName like 'a%')
Run Code Online (Sandbox Code Playgroud)

虽然我期待:

select distinct subject0_.ID as ID2_71_, …
Run Code Online (Sandbox Code Playgroud)

inheritance hibernate jpa criteria criteria-api

11
推荐指数
1
解决办法
2233
查看次数

@ViewScoped @ManagedBean中的@EJB导致java.io.NotSerializableException

在@ViewScoped托管bean中读过@EJB会导致java.io.NotSerializableException,但是我的状态保存设置是server.

这是我有的:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <display-name>sispra</display-name>
    <welcome-file-list>
        <welcome-file>index.jsf</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.BUILD_BEFORE_RESTORE</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>org.apache.myfaces.PRETTY_HTML</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>org.apache.myfaces.AUTO_SCROLL</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>primefaces.THEME</param-name>
        <param-value>glass-x</param-value>
    </context-param> …
Run Code Online (Sandbox Code Playgroud)

serialization ejb myfaces jsf-2 managed-bean

8
推荐指数
2
解决办法
6371
查看次数

java泛型:eclipse中没有显示编译器错误

我有这些课程:

public class EntityDataModel<T extends AbstractEntity>
{
    ...
}

public abstract class BarChartBean<E extends ChartEntry, T>
{
    protected EntityDataModel<? extends T> currentModel;

    ...
}
Run Code Online (Sandbox Code Playgroud)

我可以在eclipse上编译和运行这段代码而没有问题,但是当我调用时mvn compile,抛出了这个错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project edea2: Compilation failure: Compilation failure:
[ERROR] C:\Develop\...\BarChartBean.java:[53,30] error: type argument ? extends T#1 is not within bounds of type-variable T#2
[ERROR] where T#1,T#2 are type-variables:
[ERROR] T#1 extends Object declared in class BarChartBean
[ERROR] T#2 extends AbstractEntity declared in class EntityDataModel
Run Code Online (Sandbox Code Playgroud)

错误是非常明显的,从理论上讲,javac是正确的,eclipse编译器是错误的.

为什么会有这样的差异? …

java eclipse maven-3 maven maven-compiler-plugin

8
推荐指数
1
解决办法
828
查看次数

如何部署Web应用程序并创建其资源

在我必须在glassfish 4上部署"myapp.war"之前

  1. 创建jdbc连接池(/WEB-INF/glassfish-resources.xml - > jdbc-connection-pool不能单独工作......从asadmin可以正常工作)
  2. 为池创建jdbc资源(/WEB-INF/glassfish-resources.xml - > jdbc-resource与上面相同)
  3. 创建auth-realm(没有自动,现在使用asadmin)
  4. 创建模式(peristence.xml - > property javax.persistence.schema-generation.create-database-schemas,但是是伪造的)
  5. 创建表(persistence.xml - >`create-tables',不完美,但至少它可以工作)

现在我在做:

  1. 在/ tmp/install上传"myapp.war","glassfish-resources.xml"
  2. asadmin add-resources ...
  3. asadmin create-auth-realm ...
  4. asadmin deploy ...
  5. asadmin disable myapp ...
  6. nano /.../glassfish/applications/myapp/WEB-INF/classes/META-INF/persistence.xml
  7. 注释几行字,ctrl+o,enter,ctrl+x,enter
  8. asadmin enable myapp ...
  9. rm -Rf /tmp/install

没有其他建议我打算:

  1. 在/ tmp/install上传"myapp.war","deploy.sh"
  2. chmod +x deploy.sh
  3. ./deploy.sh

并且脚本将处理所有事情.但我想上传通过HTTP的GlassFish控制台war文件,并获得相同的结果.

有没有办法让一个类或脚本之前 调用contextInitialized

你会如何部署这个东西?


为了完整性,这里有一些额外的信息:

/myapp/WEB-INF/classes/META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" …
Run Code Online (Sandbox Code Playgroud)

java deployment resources web-applications glassfish

7
推荐指数
1
解决办法
2万
查看次数

PrimeFaces嵌套表单在p:对话框中,其中appendTo ="@(body)

我有这个片段:

<h:form id="form">

    <!-- other content -->

    <p:panel id="panel" header="test">
        <p:inputText id="input1" value="#{viewScope.prop1}" required="true" />
        <p:commandButton id="button1" process="@form" update="@form @widgetVar(dialog)"
            oncomplete="PF('dialog').show()" value="ok" />
    </p:panel>

    <!-- other content -->

</h:form>

<p:dialog id="dialog" header="dialog" widgetVar="dialog" modal="true">
    <h:form id="form2">
        <p:inputText id="input2" value="#{viewScope.prop1}" required="true" />
        <p:commandButton id="button2" process="@form" update="@form" value="ok" />
    </h:form>
</p:dialog>
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.

我想要达到的目的是:

<h:form id="form">

    <!-- other content -->

    <!-- fragment start -->
    <!-- this fragment will be on its own file and included via ui:include (or inside composite component) -->
    <p:panel …
Run Code Online (Sandbox Code Playgroud)

jsf dialog nested-forms primefaces jsf-2.2

7
推荐指数
1
解决办法
1万
查看次数

Primefaces DataTable,延迟加载和每行CommandButton

我有这个简单的页面:

<h:form id="form">

    <p:dataTable value="#{testBean.unitTypeModel}" var="elem" lazy="true" rows="10">
        <p:column headerText="class">#{elem.class.simpleName}</p:column>
        <p:column headerText="code">#{elem.code}</p:column>
        <p:column headerText="description">#{elem.description}</p:column>
        <p:column headerText="action">
            <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit">
                <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/>
            </p:commandButton>
        </p:column>
    </p:dataTable>

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/>

</h:form>
Run Code Online (Sandbox Code Playgroud)

并且CommandButton内部DataTable不起作用,只刷新页面.但外面的人正在工作.

如果我改变valuelazy这种方式:

<h:form id="form">

    <p:dataTable value="#{testBean.unitTypeModel.load(0, 10, null, null, null)}" var="elem" lazy="false" rows="10">
        <p:column headerText="class">#{elem.class.simpleName}</p:column>
        <p:column headerText="code">#{elem.code}</p:column>
        <p:column headerText="description">#{elem.description}</p:column>
        <p:column headerText="action">
            <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit">
                <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/>
            </p:commandButton>
        </p:column>
    </p:dataTable>

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/>

</h:form>
Run Code Online (Sandbox Code Playgroud)

CommanButton里面 …

lazy-loading datatables primefaces jsf-2

6
推荐指数
2
解决办法
6334
查看次数

组件ID形式:composite:j_id2已在视图中找到

/test.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:composite="http://java.sun.com/jsf/composite/components">
    <f:view>

        <h:head>
            <title>Default Title</title>
        </h:head>

        <h:body>
            <h:form id="form">
                <composite:test id="composite"/>
            </h:form>
        </h:body>

    </f:view>

</html>
Run Code Online (Sandbox Code Playgroud)

/resources/components/test.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:composite="http://java.sun.com/jsf/composite/components"
      xmlns:p="http://primefaces.org/ui">

    <head>
        <title>(For validation only)</title>
    </head>

    <body>
    <cc:interface>
    </cc:interface>

    <cc:implementation>

        <p:panel header="header foo bar">

            <p:panel>
                <f:facet name="header">
                    <h:outputText value="foo"/>

                    <h:outputText value="bar"/>
                </f:facet>
            </p:panel>

        </p:panel>

    </cc:implementation>

</body>

</html>
Run Code Online (Sandbox Code Playgroud)

这种组合给出:

GRAVE: Error Rendering View[/test.xhtml]
java.lang.IllegalStateException: Component ID form:composite:j_id2 …
Run Code Online (Sandbox Code Playgroud)

duplicates composite-component jsf-2

5
推荐指数
1
解决办法
1万
查看次数

Liquibase:组织变更日志的最佳实践

除了组织您的变更日志外,我几乎同意Liquibase最佳实践中的每个字眼

我要实现两个主要目标:

1)在application-7.0.0上部署:

if not exists database 'app-db'
    create database 'app-db' using database-7.0.0.ddl
    sync database 'app-db' with changelog-7.0.0.xml
else
    update database 'app-db' with changelog-7.0.0.xml
Run Code Online (Sandbox Code Playgroud)

2)在application-7.0.0版本上:

for each X : version of application (except 7.0.0)
    create database 'test-source' using database-X.0.0.ddl
    sync database 'test-source' with changelog-X.0.0.xml
    update database 'test-source' with changelog-7.0.0.xml

    create database 'test-target' using database-7.0.0.ddl
    sync database 'test-target' with changelog-7.0.0.xml

    diff databases 'test-target' with 'test-source'
    if are not equals 
        throw ERROR
Run Code Online (Sandbox Code Playgroud)

我知道这有点多余,但是我想再次确定,也许您可​​以说服我(我希望如此),这是没有必要的。

对于第一个目标,使用主从策略来组织变更日志就足够了,但是对于第二个目标,则还不够,因为我没有每个版本的主文件。

所以我想出了一个新的策略:

新版面

每个changelog.xml …

java mysql database-migration liquibase

5
推荐指数
1
解决办法
6074
查看次数

EJB 接口 JNDI 查找

我有一个界面

@Local
public interface TestService extends Serializable
{
    public void aMethod();
}
Run Code Online (Sandbox Code Playgroud)

一个实现它的无状态 bean

@Stateless
public class MyappServiceBean implements TestService
{
    private static final long serialVersionUID = 1L;

    @Override
    public void aMethod()
    {
        // do something...
    }
}
Run Code Online (Sandbox Code Playgroud)

托管 bean

@ManagedBean
public class MyappBean implements Serializable
{
    private static final long serialVersionUID = 1L;

    @EJB
    private TestService service;

    ...
}
Run Code Online (Sandbox Code Playgroud)

和这个 POJO

public class TestPojo implements Serializable
{
    private static final long serialVersionUID = 1L;

    private final TestService service;

    public …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection ejb jndi

5
推荐指数
1
解决办法
4964
查看次数